bool onSetupSample() { createCoorditeAxis( 120 ); mMainCamera->setLookAt( Vector3( 0,0,150 ) , Vector3(0,0,0), Vector3(0,1,0) ); Vertex vtx[4] = { { 0 , 0 , 0 , 0 , 0 , 1 } , { 100 , 0 , 0 , 1 , 0 , 0 } , { 100 , 100 , 0 , 1 , 1 , 1 } , { 0 , 100 , 0 , 0 , 1 , 0 } , }; int idx[6] = { 0 , 1 , 2 , 0 , 2 , 3 , }; Material* mat = mWorld->createMaterial( 0 , 0 , 0 , 1 , Color4f( 1 , 1 , 1 , 1 ) ); ShaderEffect* shader = mat->addShaderEffect( "CoordTest" ,"CoordTest" ); shader->addParam( SP_WVP , "mWVP" ); mat->setLightingColor( CFLC_EMISSIVE , CFMC_VERTEX_C1 ); Object* obj = mMainScene->createObject(); obj->createIndexedTriangle( mat , CFVT_XYZ_CF1 , (float*)vtx , 4 , idx , 2 ); return true; }
ShaderEffect* ShaderEffect::create(const char* fragmentSource) { ShaderEffect *pRet = new ShaderEffect(); if (pRet!=nullptr) { pRet->initWithFragmentSource(fragmentSource); pRet->autorelease(); return pRet; } else { delete pRet; pRet = NULL; return NULL; } }
void Demo::Display(float t) { glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); gWorld = Matrix4::rotationY(t * 60 * 3.14159f / 180.f); gWorld *= Matrix4::rotationX(-90.0f * 3.14159f / 180.f); gTime = t; gExplode = 0.5 * t; vLightDirs = Vector4(-0.577f, 0.577f, -0.577f, 1.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); mExtrudeEffect.Enable(); gModel.Draw(*this); glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBlitFramebuffer(0, 0, WindowWidth, WindowHeight, 0, 0, WindowWidth, WindowHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); }
void ShaderEffectSource::attachSourceItem() { if (!m_sourceItem) return; ShaderEffect *effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect()); if (!effect) { effect = new ShaderEffect(); m_sourceItem->setGraphicsEffect(effect); } if (effect) effect->addRenderTarget(this); m_sourceItem->update(); }
void ShaderEffectSource::detachSourceItem() { if (!m_sourceItem) return; ShaderEffect* effect = qobject_cast<ShaderEffect*> (m_sourceItem->graphicsEffect()); if (effect) effect->removeRenderTarget(this); delete m_fbo; m_fbo = 0; delete m_multisampledFbo; m_multisampledFbo = 0; m_dirtyTexture = true; }
void Demo::Init() { glGenTextures(1, &mColTex); glBindTexture(GL_TEXTURE_2D, mColTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, WindowWidth, WindowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glGenTextures(1, &mDepthTex); glBindTexture(GL_TEXTURE_2D, mDepthTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, WindowWidth, WindowHeight, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0); glGenFramebuffers(1, &mFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColTex, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, mDepthTex, 0); ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); glFrontFace(GL_CW); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glClearColor(0.0f, 0.125f, 0.3f, 1.0f); mExtrudeEffect.Create(); mExtrudeEffect.AddCompileFlags(HLSLCC_FLAG_GS_ENABLED); mExtrudeEffect.FromByteFile(std::string("shaders/ExtrudePS.o")); mExtrudeEffect.FromByteFile(std::string("shaders/ExtrudeVS.o")); mExtrudeEffect.FromByteFile(std::string("shaders/ExtrudeGS.o")); mExtrudeEffect.Link(); gWorld = Matrix4::identity(); Point3 Eye( 0.0f, 0.0f, -800.0f ); Point3 At( 0.0f, 0.0f, 0.0f ); Vector3 Up( 0.0f, 1.0f, 0.0f ); gView = Matrix4::lookAt(Eye, At, Up); ResizeDisplay(WindowWidth, WindowHeight); gModel.Import3DFromFile("models/Tiny.x"); }
int UtcDaliObjectRegistrySignalShaderEffectCreated(void) { TestApplication application; ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry(); static const char* VertexSource = "void main()\n" "{\n" " gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n" " vTexCoord = aTexCoord;\n" "}\n"; static const char* FragmentSource = "void main()\n" "{\n" " gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n" "}\n"; bool verified = false; TestShaderEffectCallback test(verified); Dali::RefObject* objectPointer = NULL; TestObjectDestroyedCallback test2(verified, objectPointer); registry.ObjectCreatedSignal().Connect(&application, test); registry.ObjectDestroyedSignal().Connect(&application, test2); { ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource ); DALI_TEST_CHECK( test.mSignalVerified ); verified = false; objectPointer = effect.GetObjectPtr(); } DALI_TEST_CHECK( test.mSignalVerified ); END_TEST; }
static void DoApply( ImageActor actor, const std::string& maskImage, const Vector2& maskSize, Vector4 maskBorder ) { const char* ALPHA_MASK_VERTEX_SHADER_SOURCE = "uniform vec2 uImageSize; \n" "uniform vec2 uMaskSize; \n" "varying vec2 vMaskTexCoord; \n" " \n" "void main() \n" "{ \n" " gl_Position = uMvpMatrix * vec4(aPosition, 1.0); \n" " \n" " // Ignore mask UVs for image \n" " \n" " highp vec2 halfImageSize = uImageSize * 0.5; \n" " vTexCoord = (aPosition.xy + halfImageSize) / uImageSize; \n" " \n" " // UVs were calculated for image size, so convert for mask size \n" " \n" " highp vec2 halfMaskSize = uMaskSize * 0.5; \n" " highp vec2 halfSizeDelta = halfImageSize - halfMaskSize; \n" " \n" " highp vec2 maskPosition = aPosition.xy; \n" " maskPosition.x -= halfSizeDelta.x * sign(aPosition.x); \n" " maskPosition.y -= halfSizeDelta.y * sign(aPosition.y); \n" " \n" " vMaskTexCoord = (maskPosition + halfMaskSize) / uMaskSize; \n" "} \n"; const char* ALPHA_MASK_FRAGMENT_SHADER_SOURCE = "varying vec2 vMaskTexCoord; \n" " \n" "void main() \n" "{ \n" " highp vec4 mask = texture2D(sEffect, vMaskTexCoord); \n" " gl_FragColor = texture2D(sTexture, vTexCoord) * uColor * vec4(1,1,1,mask.a); \n" "} \n"; ShaderEffect maskEffect = ShaderEffect::New( ALPHA_MASK_VERTEX_SHADER_SOURCE, ALPHA_MASK_FRAGMENT_SHADER_SOURCE, GeometryType( GEOMETRY_TYPE_IMAGE ), ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING ) ); maskEffect.SetEffectImage( Image::New( maskImage ) ); maskEffect.SetUniform( "uImageSize", Vector2(0,0) /*Constrained to actor size*/ ); maskEffect.ApplyConstraint( Constraint::New<Vector2>( maskEffect.GetPropertyIndex("uImageSize"), Source(actor, Actor::SIZE), NinePatchMaskEffectSizeConstraint() ) ); maskEffect.SetUniform( "uMaskSize", maskSize ); // Actor must provide nine-patch style geometry for this effect to work actor.SetStyle( ImageActor::STYLE_NINE_PATCH ); actor.SetNinePatchBorder( maskBorder ); actor.SetShaderEffect( maskEffect ); }
void display(void) { // Update our time static float t = 0.0f; static uint32_t dwTimeStart = 0; uint32_t dwTimeCur = GetTickCount(); if( dwTimeStart == 0 ) dwTimeStart = dwTimeCur; t = ( dwTimeCur - dwTimeStart ) / 1000.0f; gWorld = Matrix4::rotationY(t); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); mTessEffect.Enable(); gGlobals.InnerFactor = 1+t/2; gGlobals.OuterFactor = 1+t/2; SetFloatArray(gWorld, gGlobals.World); SetFloatArray(gView, gGlobals.View); SetFloatArray(gProjection, gGlobals.Projection); mTessEffect.SetVec4(std::string("Globals"), GlobalsVec4Count, (float*)&gGlobals); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gIndexBuffer); glBindBuffer(GL_ARRAY_BUFFER, gVertexBuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), 0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), (void*)(sizeof(float)*3)); glPatchParameteri(GL_PATCH_VERTICES, 4); glDrawElements(GL_PATCHES, 24, GL_UNSIGNED_INT, 0); glutSwapBuffers(); }
void Demo::Init(const Options* options) { glGenTextures(1, &mColTex); glBindTexture(GL_TEXTURE_2D, mColTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, WindowWidth, WindowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glGenTextures(1, &mDepthTex); glBindTexture(GL_TEXTURE_2D, mDepthTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, WindowWidth, WindowHeight, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0); glGenFramebuffers(1, &mFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mColTex, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, mDepthTex, 0); ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); glFrontFace(GL_CW); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glClearColor(0.0f, 0.125f, 0.3f, 1.0f); mEffect.Create(); mEffect.FromByteFile(std::string(options->fragmentFile)); mEffect.FromByteFile(std::string(options->vertexFile)); mEffect.Link(); gWorld = Matrix4::identity(); Point3 Eye( 0.0f, 0.0f, -800 ); Point3 At( 0.0f, 0.0f, 0.0f ); Vector3 Up( 0.0f, 1.0f, 0.0f ); gView = Matrix4::lookAt(Eye, At, Up); ResizeDisplay(WindowWidth, WindowHeight); gModel.Import3DFromFile("models/Tiny.x"); mPostFXEnabled = false; if(options->postprocessFile) { mPostFXEnabled = true; mPostProcessEffect.Create(); mPostProcessEffect.FromByteFile(std::string(options->postprocessFile)); mPostProcessEffect.FromByteFile(std::string("shaders/generic/templatePostFXVS.o")); mPostProcessEffect.Link(); glGenVertexArrays(1, &mPostFXVAO); glBindVertexArray(mPostFXVAO); //Vertex setup for post-process quad uint32_t indices[] = { 1, 0, 3, 2, 3, 0 }; glGenBuffers(1, &mPostFXIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mPostFXIndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) * 6, indices, GL_STATIC_DRAW); PostProcessVertex vertices[] = { {-1, -1, 0}, {1, -1, 0}, {-1, 1, 0}, {1, 1, 0} }; glGenBuffers(1, &mPostFXVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, mPostFXVertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(PostProcessVertex) * 4, vertices, GL_STATIC_DRAW); } mComputeEnabled = false; if(options->computeFile) { mComputeEnabled = true; mCompute.Create(); mCompute.SetLanguage(LANG_430); mCompute.FromByteFile(std::string(options->computeFile)); mCompute.Link(); gModel.GetMaterial().BindForLoadStore(GL_WRITE_ONLY); } }
void Demo::Display(float t) { if(mComputeEnabled) { mCompute.Enable(); mCompute.SetFloat(std::string("GlobalsCS.Time"), 1, &gChangesEveryFrame.Time); glDispatchCompute(32, 32, 1); } glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); gWorld = Matrix4::rotationY(180.0f * 3.14159f / 180.f); gWorld *= Matrix4::rotationX(-90.0f * 3.14159f / 180.f); gTime = t; vLightDirs = Vector4(-0.577f, 0.577f, -0.577f, 1.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); mEffect.Enable(); gModel.Draw(*this); glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); if(mPostFXEnabled) { glBindFramebuffer(GL_FRAMEBUFFER, 0); glDisable(GL_DEPTH_TEST); mPostProcessEffect.Enable(); //Make the colour and depth buffers available to shaders. glBindTexture(GL_TEXTURE_2D, mColTex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); mPostProcessEffect.SetTexture("g_txColourBuffer", 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, mDepthTex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glActiveTexture(GL_TEXTURE0); mPostProcessEffect.SetTexture("g_txDepthBuffer", 1); //Draw post processing quad. glBindVertexArray(mPostFXVAO); glEnableVertexAttribArray(0); glDisableVertexAttribArray(1); glDisableVertexAttribArray(2); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mPostFXIndexBuffer); glBindBuffer(GL_ARRAY_BUFFER, mPostFXVertexBuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(PostProcessVertex), 0); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); } else { glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBlitFramebuffer(0, 0, WindowWidth, WindowHeight, 0, 0, WindowWidth, WindowHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); } }
void Init(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glewInit(); glutInitContextVersion (4, 0); #ifdef _DEBUG glutInitContextFlags (GLUT_DEBUG); #endif glutInitWindowSize (WindowWidth, WindowHeight); glutInitWindowPosition (50, 50); glutCreateWindow (argv[0]); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc (keyboard); glutIdleFunc(display); glewInit(); #ifdef _DEBUG SetupOpenGLDebugCallback(); #endif glClearColor(0.0f, 0.125f, 0.3f, 1.0f); GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); mTessEffect.Create(); mTessEffect.SetLanguage(LANG_400); mTessEffect.AddCompileFlags(HLSLCC_FLAG_TESS_ENABLED); mTessEffect.FromByteFile(std::string("shaders/tessellationPS.o")); mTessEffect.FromByteFile(std::string("shaders/tessellationVS.o")); mTessEffect.FromByteFile(std::string("shaders/tessellationHS.o")); mTessEffect.FromByteFile(std::string("shaders/tessellationDS.o")); gWorld = Matrix4::identity(); Point3 Eye( 0.0f, 4.0f, -10.0f ); Point3 At( 0.0f, 1.0f, 0.0f ); Vector3 Up( 0.0f, 1.0f, 0.0f ); gView = Matrix4::lookAt(Eye, At, Up); gProjection = Matrix4::perspective(3.14159f * 0.25f, WindowWidth / ( float )WindowHeight, 0.1f, 100.0f); uint32_t indices[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, }; glGenBuffers(1, &gIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gIndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) * 24, indices, GL_STATIC_DRAW); SimpleVertex vertices[] = { { { -1.0f, 1.0f, -1.0f }, { 0.0f, 1.0f, 0.0f } }, { { 1.0f, 1.0f, -1.0f }, { 0.0f, 1.0f, 0.0f } }, { { 1.0f, 1.0f, 1.0f }, { 0.0f, 1.0f, 0.0f } }, { { -1.0f, 1.0f, 1.0f }, { 0.0f, 1.0f, 0.0f } }, { { -1.0f, -1.0f, -1.0f }, { 0.0f, 1.0f, 0.0f } }, { { 1.0f, -1.0f, -1.0f }, { 0.0f, 1.0f, 0.0f } }, { { 1.0f, -1.0f, 1.0f }, { 0.0f, 1.0f, 0.0f } }, { { -1.0f, -1.0f, 1.0f }, { 0.0f, 1.0f, 0.0f } }, { { -1.0f, -1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f } }, { { -1.0f, -1.0f, -1.0f }, { 1.0f, 0.0f, 0.0f } }, { { -1.0f, 1.0f, -1.0f }, { 1.0f, 0.0f, 0.0f } }, { { -1.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f } }, { { 1.0f, -1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f } }, { { 1.0f, -1.0f, -1.0f }, { 1.0f, 0.0f, 0.0f } }, { { 1.0f, 1.0f, -1.0f }, { 1.0f, 0.0f, 0.0f } }, { { 1.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f } }, { { -1.0f, -1.0f, -1.0f }, { 0.0f, 0.0f, 1.0f } }, { { 1.0f, -1.0f, -1.0f }, { 0.0f, 0.0f, 1.0f } }, { { 1.0f, 1.0f, -1.0f }, { 0.0f, 0.0f, 1.0f } }, { { -1.0f, 1.0f, -1.0f }, { 0.0f, 0.0f, 1.0f } }, { { -1.0f, -1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, { { 1.0f, -1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, { { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, { { -1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, }; glGenBuffers(1, &gVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, gVertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(SimpleVertex) * 24, vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), 0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), (void*)(sizeof(float)*3)); }
void display(void) { // Update our time static float t = 0.0f; static uint32_t dwTimeStart = 0; uint32_t dwTimeCur = GetTickCount(); if( dwTimeStart == 0 ) dwTimeStart = dwTimeCur; t = ( dwTimeCur - dwTimeStart ) / 1000.0f; gWorld = Matrix4::rotationY(t); Vector4 vLightDirs[2] = { Vector4(-0.577f, 0.577f, -0.577f, 1.0f), Vector4(0.0f, 0.0f, -1.0f, 1.0f), }; Vector4 vLightColors[2] = { Vector4(0.5f, 0.5f, 0.5f, 1.0f), Vector4(0.5f, 0.0f, 0.0f, 1.0f), }; Matrix3 rotate; Vector4 vOutDir; rotate = Matrix3::rotationY(-2.0f * t); vLightDirs[1].setXYZ(rowMul (vLightDirs[1].getXYZ(), rotate)); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); mLambertLitEffect.Enable(); SetFloatArray(gWorld, gGlobals.World); SetFloatArray(gView, gGlobals.View); SetFloatArray(gProjection, gGlobals.Projection); SetFloatArray(vLightDirs[0], &gGlobals.vLightDir[0]); SetFloatArray(vLightDirs[1], &gGlobals.vLightDir[4]); SetFloatArray(vLightColors[0], &gGlobals.vLightColor[0]); SetFloatArray(vLightColors[1], &gGlobals.vLightColor[4]); #if UBO glBindBuffer(GL_UNIFORM_BUFFER, ubo); glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(gGlobals), &gGlobals); mLambertLitEffect.SetUniformBlock(std::string("SharedConsts"), 0, ubo); #else mLambertLitEffect.SetVec4(std::string("SharedConsts"), GlobalsVec4Count, (float*)&gGlobals); #endif glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gIndexBuffer); glBindBuffer(GL_ARRAY_BUFFER, gVertexBuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), 0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), (void*)(sizeof(float)*3)); glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); mSolidColour.Enable(); for(int m = 0; m < 2; m++) { Matrix4 light; Matrix4 lightScale; Vector4 vLightPos = vLightDirs[m] * 5.0f; light = Matrix4::translation(vLightPos.getXYZ()); lightScale = Matrix4::scale(Vector3(2.0f, 2.0f, 2.0f)); light = lightScale * light; SetFloatArray(light, gGlobals.World); SetFloatArray(vLightColors[m], &gGlobals.vOutputColor[0]); #if UBO glBindBuffer(GL_UNIFORM_BUFFER, ubo2); glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(gGlobals), &gGlobals); mSolidColour.SetUniformBlock(std::string("SharedConsts"), 1, ubo2); #else mSolidColour.SetVec4(std::string("SharedConsts"), GlobalsVec4Count, (float*)&gGlobals); #endif glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); } glutSwapBuffers(); }
void Init(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glewInit(); glutInitContextVersion (3, 1); #ifdef _DEBUG glutInitContextFlags (GLUT_DEBUG); #endif glutInitWindowSize (WindowWidth, WindowHeight); glutInitWindowPosition (50, 50); glutCreateWindow (argv[0]); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc (keyboard); glutIdleFunc(display); glewInit(); #ifdef _DEBUG SetupOpenGLDebugCallback(); #endif glFrontFace(GL_CCW); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glClearColor(0.0f, 0.125f, 0.3f, 1.0f); GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); mLambertLitEffect.Create(); #if UBO mLambertLitEffect.AddCompileFlags(HLSLCC_FLAG_UNIFORM_BUFFER_OBJECT); #endif mLambertLitEffect.FromByteFile(std::string("shaders/LambertLitVS.o")); mLambertLitEffect.FromByteFile(std::string("shaders/LambertLitPS.o")); mSolidColour.Create(); #if UBO mSolidColour.AddCompileFlags(HLSLCC_FLAG_UNIFORM_BUFFER_OBJECT); #endif mSolidColour.FromByteFile(std::string("shaders/LambertLitVS.o")); mSolidColour.FromByteFile(std::string("shaders/LambertLitSolidPS.o")); #if UBO mLambertLitEffect.Enable();//Must be linked in order to call CreateUniformBlock. mLambertLitEffect.CreateUniformBlock(std::string("SharedConsts"), ubo); mLambertLitEffect.SetUniformBlock(std::string("SharedConsts"), 0, ubo); mSolidColour.Enable(); mSolidColour.CreateUniformBlock(std::string("SharedConsts"), ubo2); mSolidColour.SetUniformBlock(std::string("SharedConsts"), 1, ubo2); #endif gWorld = Matrix4::identity(); Point3 Eye( 0.0f, 4.0f, -10.0f ); Point3 At( 0.0f, 1.0f, 0.0f ); Vector3 Up( 0.0f, 1.0f, 0.0f ); gView = Matrix4::lookAt(Eye, At, Up); gProjection = Matrix4::perspective(3.14159f * 0.25f, WindowWidth / ( float )WindowHeight, 0.1f, 100.0f); uint32_t indices[] = { 3,1,0, 2,1,3, 6,4,5, 7,4,6, 11,9,8, 10,9,11, 14,12,13, 15,12,14, 19,17,16, 18,17,19, 22,20,21, 23,20,22 }; glGenBuffers(1, &gIndexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gIndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) * 36, indices, GL_STATIC_DRAW); SimpleVertex vertices[] = { { { -1.0f, 1.0f, -1.0f }, { 0.0f, 1.0f, 0.0f } }, { { 1.0f, 1.0f, -1.0f }, { 0.0f, 1.0f, 0.0f } }, { { 1.0f, 1.0f, 1.0f }, { 0.0f, 1.0f, 0.0f } }, { { -1.0f, 1.0f, 1.0f }, { 0.0f, 1.0f, 0.0f } }, { { -1.0f, -1.0f, -1.0f }, { 0.0f, -1.0f, 0.0f } }, { { 1.0f, -1.0f, -1.0f }, { 0.0f, -1.0f, 0.0f } }, { { 1.0f, -1.0f, 1.0f }, { 0.0f, -1.0f, 0.0f } }, { { -1.0f, -1.0f, 1.0f }, { 0.0f, -1.0f, 0.0f } }, { { -1.0f, -1.0f, 1.0f }, { -1.0f, 0.0f, 0.0f } }, { { -1.0f, -1.0f, -1.0f }, { -1.0f, 0.0f, 0.0f } }, { { -1.0f, 1.0f, -1.0f }, { -1.0f, 0.0f, 0.0f } }, { { -1.0f, 1.0f, 1.0f }, { -1.0f, 0.0f, 0.0f } }, { { 1.0f, -1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f } }, { { 1.0f, -1.0f, -1.0f }, { 1.0f, 0.0f, 0.0f } }, { { 1.0f, 1.0f, -1.0f }, { 1.0f, 0.0f, 0.0f } }, { { 1.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 0.0f } }, { { -1.0f, -1.0f, -1.0f }, { 0.0f, 0.0f, -1.0f } }, { { 1.0f, -1.0f, -1.0f }, { 0.0f, 0.0f, -1.0f } }, { { 1.0f, 1.0f, -1.0f }, { 0.0f, 0.0f, -1.0f } }, { { -1.0f, 1.0f, -1.0f }, { 0.0f, 0.0f, -1.0f } }, { { -1.0f, -1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, { { 1.0f, -1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, { { 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, { { -1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f } }, }; glGenBuffers(1, &gVertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, gVertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(SimpleVertex) * 24, vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), 0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(SimpleVertex), (void*)(sizeof(float)*3)); }