GLuint modelEngine::linkShaderProgram(int shaderIndex) { GLuint programHandle = glCreateProgram(); glAttachShader(programHandle, shaders[shaderIndex].vertexShader); glAttachShader(programHandle, shaders[shaderIndex].fragmentShader); glLinkProgram(programHandle); showprogramlog(programHandle); shaders[shaderIndex].program = programHandle; // Get and store attributes GLint attribLocation = 0; attribLocation = glGetAttribLocation(programHandle, "Position"); if(attribLocation != GL_INVALID_OPERATION) { shaders[shaderIndex].Position = attribLocation; } attribLocation = glGetAttribLocation(programHandle, "SourceColor"); if(attribLocation != GL_INVALID_OPERATION) { shaders[shaderIndex].SourceColor = attribLocation; } // Enable attribute glVertexAttribPointer(shaders[shaderIndex].Position, 4, GL_FLOAT, 0, 16, 0); glEnableVertexAttribArray(shaders[shaderIndex].Position); numShaders++; return programHandle; }
static void init_shaders(CUBE_STATE_T *state) { static const GLfloat vertex_data[] = { -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, -1.0,1.0,1.0, }; const GLchar *vshader_source = "attribute vec4 vertex;" "varying vec2 tcoord;" "void main(void) {" " vec4 pos = vertex;" " gl_Position = pos;" " tcoord = vertex.xy*0.5+0.5;" "}"; #if 0 //Mandelbrot const GLchar *mandelbrot_fshader_source = "uniform vec4 color;" "uniform vec2 scale;" "uniform vec2 centre;" "varying vec2 tcoord;" "void main(void) {" " float intensity;" " vec4 color2;" " float cr=(gl_FragCoord.x-centre.x)*scale.x;" " float ci=(gl_FragCoord.y-centre.y)*scale.y;" " float ar=cr;" " float ai=ci;" " float tr,ti;" " float col=0.0;" " float p=0.0;" " int i=0;" " for(int i2=1;i2<16;i2++)" " {" " tr=ar*ar-ai*ai+cr;" " ti=2.0*ar*ai+ci;" " p=tr*tr+ti*ti;" " ar=tr;" " ai=ti;" " if (p>16.0)" " {" " i=i2;" " break;" " }" " }" " color2 = vec4(float(i)*0.0625,0,0,1);" " gl_FragColor = color2;" "}"; // Julia const GLchar *julia_fshader_source = "uniform vec4 color;" "uniform vec2 scale;" "uniform vec2 centre;" "uniform vec2 offset;" "varying vec2 tcoord;" "uniform sampler2D tex;" "void main(void) {" " float intensity;" " vec4 color2;" " float ar=(gl_FragCoord.x-centre.x)*scale.x;" " float ai=(gl_FragCoord.y-centre.y)*scale.y;" " float cr=(offset.x-centre.x)*scale.x;" " float ci=(offset.y-centre.y)*scale.y;" " float tr,ti;" " float col=0.0;" " float p=0.0;" " int i=0;" " vec2 t2;" " t2.x=tcoord.x+(offset.x-centre.x)*(0.5/centre.y);" " t2.y=tcoord.y+(offset.y-centre.y)*(0.5/centre.x);" " for(int i2=1;i2<16;i2++)" " {" " tr=ar*ar-ai*ai+cr;" " ti=2.0*ar*ai+ci;" " p=tr*tr+ti*ti;" " ar=tr;" " ai=ti;" " if (p>16.0)" " {" " i=i2;" " break;" " }" " }" " color2 = vec4(0,float(i)*0.0625,0,1);" " color2 = color2+texture2D(tex,t2);" " gl_FragColor = color2;" "}"; state->vshader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(state->vshader, 1, &vshader_source, 0); glCompileShader(state->vshader); check(); if (state->verbose) showlog(state->vshader); state->fshader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(state->fshader, 1, &julia_fshader_source, 0); glCompileShader(state->fshader); check(); if (state->verbose) showlog(state->fshader); state->mshader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(state->mshader, 1, &mandelbrot_fshader_source, 0); glCompileShader(state->mshader); check(); if (state->verbose) showlog(state->mshader); // julia state->program = glCreateProgram(); glAttachShader(state->program, state->vshader); glAttachShader(state->program, state->fshader); glLinkProgram(state->program); check(); if (state->verbose) showprogramlog(state->program); state->attr_vertex = glGetAttribLocation(state->program, "vertex"); state->unif_color = glGetUniformLocation(state->program, "color"); state->unif_scale = glGetUniformLocation(state->program, "scale"); state->unif_offset = glGetUniformLocation(state->program, "offset"); state->unif_tex = glGetUniformLocation(state->program, "tex"); state->unif_centre = glGetUniformLocation(state->program, "centre"); // mandelbrot state->program2 = glCreateProgram(); glAttachShader(state->program2, state->vshader); glAttachShader(state->program2, state->mshader); glLinkProgram(state->program2); check(); if (state->verbose) showprogramlog(state->program2); state->attr_vertex2 = glGetAttribLocation(state->program2, "vertex"); state->unif_scale2 = glGetUniformLocation(state->program2, "scale"); state->unif_offset2 = glGetUniformLocation(state->program2, "offset"); state->unif_centre2 = glGetUniformLocation(state->program2, "centre"); check(); #endif glClearColor ( 0.0, 1.0, 1.0, 1.0 ); glGenBuffers(1, &state->buf); check(); // Prepare a texture image glGenTextures(1, &state->tex); check(); glBindTexture(GL_TEXTURE_2D,state->tex); check(); // glActiveTexture(0) glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,state->screen_width,state->screen_height,0,GL_RGB,GL_UNSIGNED_SHORT_5_6_5,0); check(); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); check(); // Prepare a framebuffer for rendering glGenFramebuffers(1,&state->tex_fb); check(); glBindFramebuffer(GL_FRAMEBUFFER,state->tex_fb); check(); glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,state->tex,0); check(); glBindFramebuffer(GL_FRAMEBUFFER,0); check(); // Prepare viewport glViewport ( 0, 0, state->screen_width, state->screen_height ); check(); // Upload vertex data to a buffer glBindBuffer(GL_ARRAY_BUFFER, state->buf); glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW); glVertexAttribPointer(state->attr_vertex, 3, GL_FLOAT, 0, 12, 0); glEnableVertexAttribArray(state->attr_vertex); check(); }
int main () { int terminate = 1; bcm_host_init(); // Clear application state memset( state, 0, sizeof( *state ) ); // Start OGLES init_ogl(state); //init_shaders(state); char vShaderSource[] = "attribute vec4 vPosition; \n" "uniform vec4 offset; \n" "void main() \n" "{ \n" " vec4 nPosition = (vPosition*vec4(0.25, 0.25, 0.25, 1.0))+offset; \n" " gl_Position = nPosition; \n" "} \n"; //everything is black char fShaderSource[] = "precision mediump float; \n" "void main() \n" "{ \n" " gl_FragColor = vec4(1.0, 1.0, 1.0, 0.5); \n" "} \n"; GLuint vshader = LoadShader(vShaderSource, GL_VERTEX_SHADER); GLuint fshader = LoadShader(fShaderSource, GL_FRAGMENT_SHADER); GLuint programObj = glCreateProgram(); GLint linked; check(); assert(programObj != 0); glAttachShader(programObj, vshader); glAttachShader(programObj, fshader); glBindAttribLocation(programObj, 0, "vPosition"); check(); glLinkProgram(programObj); check(); glGetProgramiv(programObj, GL_LINK_STATUS, &linked); if(linked != GL_TRUE) { showprogramlog(programObj); glDeleteProgram(programObj); return -1; } GLint offset = glGetUniformLocation(programObj, "offset"); check(); GLfloat vVertices[] = { 0.f, -0.25f, 0.0f, 0.5f, 0.25f, 0.0f, 0.75f, -0.25f, 0.0f }; glViewport(0,0, state->screen_width, state->screen_height); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(programObj); GLfloat offet_vector[] = { 0.5f, 0.0f, 0.0f, 0.0f }; glUniform4fv(offset, 4, offet_vector); glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 0, vVertices); glEnableVertexAttribArray(0); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); GLfloat square[] = { -1.00f, -1.00f, 0.0f, // Bottom Left 1.00f, -1.00f, 0.0f, // Bottom Right -1.00f, 1.00f, 0.0f, // Top Left 1.00f, 1.00f, 0.0f //Top Right }; GLfloat sqoffet_vector[] = { -0.5f, 0.0f, 0.0f, 0.0f }; glUniform4fv(offset, 4, sqoffet_vector); //glUniform1f(offset, -0.5); glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 0, square); glEnableVertexAttribArray(0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableVertexAttribArray(0); eglSwapBuffers(state->display, state->surface); getchar(); while (!terminate) { } return 0; }
static void init_shaders(CUBE_STATE_T *state) { static const GLfloat vertex_data[] = { -1.0,-1.0,1.0,1.0, 1.0,-1.0,1.0,1.0, 1.0,1.0,1.0,1.0, -1.0,1.0,1.0,1.0 }; const GLchar *vshader_source = "attribute vec4 vertex;" "void main(void) {" " vec4 pos = vertex;" " gl_Position = pos;" "}"; const GLchar *fshader_source = "void main(void) {" " gl_FragColor = vec4(0,1,0,1);" "}"; state->vshader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(state->vshader, 1, &vshader_source, 0); glCompileShader(state->vshader); check(); if (state->verbose) showlog(state->vshader); state->fshader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(state->fshader, 1, &fshader_source, 0); glCompileShader(state->fshader); check(); if (state->verbose) showlog(state->fshader); state->program = glCreateProgram(); glAttachShader(state->program, state->vshader); glAttachShader(state->program, state->fshader); glLinkProgram(state->program); check(); if (state->verbose) showprogramlog(state->program); state->attr_vertex = glGetAttribLocation(state->program, "vertex"); #if 0 state->unif_color = glGetUniformLocation(state->program, "color"); state->unif_scale = glGetUniformLocation(state->program, "scale"); state->unif_offset = glGetUniformLocation(state->program, "offset"); state->unif_tex = glGetUniformLocation(state->program, "tex"); state->unif_centre = glGetUniformLocation(state->program, "centre"); #endif check(); glClearColor ( 0.0, 1.0, 1.0, 1.0 ); glGenBuffers(1, &state->buf); check(); // Prepare a texture image glGenTextures(1, &state->tex); check(); glBindTexture(GL_TEXTURE_2D,state->tex); check(); // glActiveTexture(0) glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,state->screen_width,state->screen_height,0,GL_RGB,GL_UNSIGNED_SHORT_5_6_5,0); check(); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); check(); // Prepare a framebuffer for rendering glGenFramebuffers(1,&state->tex_fb); check(); glBindFramebuffer(GL_FRAMEBUFFER,state->tex_fb); check(); glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,state->tex,0); check(); glBindFramebuffer(GL_FRAMEBUFFER,0); check(); // Prepare viewport glViewport ( 0, 0, state->screen_width, state->screen_height ); check(); // Upload vertex data to a buffer glBindBuffer(GL_ARRAY_BUFFER, state->buf); glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW); glVertexAttribPointer(state->attr_vertex, 4, GL_FLOAT, 0, 16, 0); glEnableVertexAttribArray(state->attr_vertex); check(); }