Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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,
   };
   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();
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
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();
}