void ofMaterial::initShaders(ofGLProgrammableRenderer & renderer) const{ if(!shadersInitialized || ofLightsData().size()!=shaderLights){ #ifndef TARGET_OPENGLES string vertexRectHeader = renderer.defaultVertexShaderHeader(GL_TEXTURE_RECTANGLE); string fragmentRectHeader = renderer.defaultFragmentShaderHeader(GL_TEXTURE_RECTANGLE); #endif string vertex2DHeader = renderer.defaultVertexShaderHeader(GL_TEXTURE_2D); string fragment2DHeader = renderer.defaultFragmentShaderHeader(GL_TEXTURE_2D); shaderLights = ofLightsData().size(); shaderNoTexture.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertex2DHeader,shaderLights,false)); shaderNoTexture.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragment2DHeader,shaderLights,false)); shaderNoTexture.bindDefaults(); shaderNoTexture.linkProgram(); shaderTexture2D.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertex2DHeader,shaderLights,true)); shaderTexture2D.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragment2DHeader,shaderLights,true)); shaderTexture2D.bindDefaults(); shaderTexture2D.linkProgram(); #ifndef TARGET_OPENGLES shaderTextureRect.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertexRectHeader,shaderLights,true)); shaderTextureRect.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragmentRectHeader,shaderLights,true)); shaderTextureRect.bindDefaults(); shaderTextureRect.linkProgram(); #endif shadersInitialized = true; } }
void ofMaterial::initShaders(){ if(!shadersInitialized || ofLightsData().size()!=shaderLights){ shaderLights = ofLightsData().size(); shaderNoTexture.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(shaderLights,false,false)); shaderNoTexture.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(shaderLights,false,false)); shaderNoTexture.bindDefaults(); shaderNoTexture.linkProgram(); shaderTexture2D.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(shaderLights,true,false)); shaderTexture2D.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(shaderLights,true,false)); shaderTexture2D.bindDefaults(); shaderTexture2D.linkProgram(); #ifndef TARGET_OPENGLES shaderTextureRect.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(shaderLights,true,true)); shaderTextureRect.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(shaderLights,true,true)); shaderTextureRect.bindDefaults(); shaderTextureRect.linkProgram(); #endif shadersInitialized = true; } }
void c3_exercise_1::run() { SDL_Init(SDL_INIT_VIDEO); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); SDL_Window *window = SDL_CreateWindow("OpenGL", 100, 100, 800, 600, SDL_WINDOW_OPENGL); SDL_GLContext context = SDL_GL_CreateContext(window); glewExperimental = GL_TRUE; glewInit(); GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLuint vbo = generateVBO(); GLuint ebo = generateEBO(); GLuint vertexShader = compileShader(vertexSource(), GL_VERTEX_SHADER); GLuint fragmentShader = compileShader(fragmentSource(), GL_FRAGMENT_SHADER); GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); //glBindFragDataLocation(shaderProgram, 0, "outColor"); // Not necessary since there is only one output glLinkProgram(shaderProgram); glUseProgram(shaderProgram); size_t floatSize = sizeof(float); size_t stride = 7; GLint posAttrib = glGetAttribLocation(shaderProgram, "position"); glEnableVertexAttribArray(posAttrib); glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, stride * floatSize, 0); GLint colAttrib = glGetAttribLocation(shaderProgram, "color"); glEnableVertexAttribArray(colAttrib); glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, stride * floatSize, (GLvoid *)(2 * floatSize)); GLint texAttrib = glGetAttribLocation(shaderProgram, "texcoord"); glEnableVertexAttribArray(texAttrib); glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, stride * floatSize, (GLvoid *)(5 * floatSize)); std::array<GLuint, 2> textures{}; loadTextures(textures, shaderProgram); GLint uniTime = glGetUniformLocation(shaderProgram, "time"); SDL_Event windowEvent; while (true) { if (SDL_PollEvent(&windowEvent)) { if (windowEvent.type == SDL_QUIT) { break; } if (windowEvent.type == SDL_KEYUP && windowEvent.key.keysym.sym == SDLK_ESCAPE) { break; } } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUniform1f(uniTime, (GLfloat)clock() / (GLfloat)CLOCKS_PER_SEC); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); SDL_GL_SwapWindow(window); } glDeleteTextures(2, textures.data()); glDeleteProgram(shaderProgram); glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glDeleteBuffers(1, &vbo); glDeleteVertexArrays(1, &vao); SDL_GL_DeleteContext(context); SDL_Quit(); }
void ofMaterial::initShaders(ofGLProgrammableRenderer & renderer) const{ auto rendererShaders = shaders.find(&renderer); if(rendererShaders == shaders.end() || rendererShaders->second->numLights != ofLightsData().size()){ if(shadersMap[&renderer].find(data.postFragment)!=shadersMap[&renderer].end()){ auto newShaders = shadersMap[&renderer][data.postFragment].lock(); if(newShaders == nullptr || newShaders->numLights != ofLightsData().size()){ shadersMap[&renderer].erase(data.postFragment); shaders[&renderer] = nullptr; }else{ shaders[&renderer] = newShaders; } } } if(shaders[&renderer] == nullptr){ #ifndef TARGET_OPENGLES string vertexRectHeader = renderer.defaultVertexShaderHeader(GL_TEXTURE_RECTANGLE); string fragmentRectHeader = renderer.defaultFragmentShaderHeader(GL_TEXTURE_RECTANGLE); #endif string vertex2DHeader = renderer.defaultVertexShaderHeader(GL_TEXTURE_2D); string fragment2DHeader = renderer.defaultFragmentShaderHeader(GL_TEXTURE_2D); auto numLights = ofLightsData().size(); shaders[&renderer].reset(new Shaders); shaders[&renderer]->numLights = numLights; shaders[&renderer]->noTexture.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertex2DHeader,numLights,false,false)); shaders[&renderer]->noTexture.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragment2DHeader, data.customUniforms, data.postFragment,numLights,false,false)); shaders[&renderer]->noTexture.bindDefaults(); shaders[&renderer]->noTexture.linkProgram(); shaders[&renderer]->texture2D.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertex2DHeader,numLights,true,false)); shaders[&renderer]->texture2D.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragment2DHeader, data.customUniforms, data.postFragment,numLights,true,false)); shaders[&renderer]->texture2D.bindDefaults(); shaders[&renderer]->texture2D.linkProgram(); #ifndef TARGET_OPENGLES shaders[&renderer]->textureRect.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertexRectHeader,numLights,true,false)); shaders[&renderer]->textureRect.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragmentRectHeader, data.customUniforms, data.postFragment,numLights,true,false)); shaders[&renderer]->textureRect.bindDefaults(); shaders[&renderer]->textureRect.linkProgram(); #endif shaders[&renderer]->color.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertex2DHeader,numLights,false,true)); shaders[&renderer]->color.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragment2DHeader, data.customUniforms, data.postFragment,numLights,false,true)); shaders[&renderer]->color.bindDefaults(); shaders[&renderer]->color.linkProgram(); shaders[&renderer]->texture2DColor.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertex2DHeader,numLights,true,true)); shaders[&renderer]->texture2DColor.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragment2DHeader, data.customUniforms, data.postFragment,numLights,true,true)); shaders[&renderer]->texture2DColor.bindDefaults(); shaders[&renderer]->texture2DColor.linkProgram(); #ifndef TARGET_OPENGLES shaders[&renderer]->textureRectColor.setupShaderFromSource(GL_VERTEX_SHADER,vertexSource(vertexRectHeader,numLights,true,true)); shaders[&renderer]->textureRectColor.setupShaderFromSource(GL_FRAGMENT_SHADER,fragmentSource(fragmentRectHeader, data.customUniforms, data.postFragment,numLights,true,true)); shaders[&renderer]->textureRectColor.bindDefaults(); shaders[&renderer]->textureRectColor.linkProgram(); #endif shadersMap[&renderer][data.postFragment] = shaders[&renderer]; } }