GLUSboolean init(GLUSvoid) { GLUStextfile vertexSource; GLUStextfile fragmentSource; GLUStgaimage image; GLUSshape plane; glusFileLoadText("shader/texture.vert.glsl", &vertexSource); glusFileLoadText("shader/grey.frag.glsl", &fragmentSource); glusProgramBuildFromSource(&g_program, (const GLchar**) &vertexSource.text, 0, 0, 0, (const GLchar**) &fragmentSource.text); glusFileDestroyText(&vertexSource); glusFileDestroyText(&fragmentSource); // // Retrieve the uniform locations in the program. g_modelViewProjectionMatrixLocation = glGetUniformLocation(g_program.program, "u_modelViewProjectionMatrix"); g_textureLocation = glGetUniformLocation(g_program.program, "u_texture"); g_vertexLocation = glGetAttribLocation(g_program.program, "a_vertex"); g_texCoordLocation = glGetAttribLocation(g_program.program, "a_texCoord"); // // Load the image. glusImageLoadTga("../../media/desert.tga", &image); // Generate and bind a texture. glGenTextures(1, &g_texture); glBindTexture(GL_TEXTURE_2D, g_texture); // Transfer the image data from the CPU to the GPU. glTexImage2D(GL_TEXTURE_2D, 0, image.format, image.width, image.height, 0, image.format, GL_UNSIGNED_BYTE, image.data); // Setting the texture parameters. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBindTexture(GL_TEXTURE_2D, 0); // // Use a helper function to create a rectangular plane. glusShapeCreateRectangularPlanef(&plane, (GLfloat) image.width / 2.0f, (GLfloat) image.height / 2.0f); // Destroying now the image, as the width and height was used above. glusImageDestroyTga(&image); // Store the number indices, as we will render with glDrawElements. g_numberIndicesPlane = plane.numberIndices; glGenBuffers(1, &g_verticesVBO); glBindBuffer(GL_ARRAY_BUFFER, g_verticesVBO); glBufferData(GL_ARRAY_BUFFER, plane.numberVertices * 4 * sizeof(GLfloat), (GLfloat*) plane.vertices, GL_STATIC_DRAW); glGenBuffers(1, &g_texCoordsVBO); glBindBuffer(GL_ARRAY_BUFFER, g_texCoordsVBO); glBufferData(GL_ARRAY_BUFFER, plane.numberVertices * 2 * sizeof(GLfloat), (GLfloat*) plane.texCoords, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); // Generate a VBO for the indices. glGenBuffers(1, &g_indicesVBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_indicesVBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, plane.numberIndices * sizeof(GLuint), (GLuint*) plane.indices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Now we can destroy the shape, as all data is now on the GPU. glusShapeDestroyf(&plane); // glUseProgram(g_program.program); glGenVertexArrays(1, &g_vao); glBindVertexArray(g_vao); glBindBuffer(GL_ARRAY_BUFFER, g_verticesVBO); glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(g_vertexLocation); glBindBuffer(GL_ARRAY_BUFFER, g_texCoordsVBO); glVertexAttribPointer(g_texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(g_texCoordLocation); // Also bind the indices to the VAO. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_indicesVBO); // // Also bind created texture ... glBindTexture(GL_TEXTURE_2D, g_texture); // ... and as this is texture number 0, bind the uniform to the program. glUniform1i(g_textureLocation, 0); // glClearColor(0.0f, 0.0f, 0.0f, 0.0f); return GLUS_TRUE; }
GLUSboolean init(GLUSvoid) { GLUStextfile vertexSource; GLUStextfile fragmentSource; GLUStextfile computeSource; GLUSshape plane; glusFileLoadText("../Example21/shader/texture.vert.glsl", &vertexSource); glusFileLoadText("../Example21/shader/texture.frag.glsl", &fragmentSource); glusProgramBuildFromSource(&g_program, (const GLchar**) &vertexSource.text, 0, 0, 0, (const GLchar**) &fragmentSource.text); glusFileDestroyText(&vertexSource); glusFileDestroyText(&fragmentSource); glusFileLoadText("../Example21/shader/texture.comp.glsl", &computeSource); glusProgramBuildComputeFromSource(&g_computeProgram, (const GLchar**) &computeSource.text); glusFileDestroyText(&computeSource); // // Retrieve the uniform locations in the program. g_modelViewProjectionMatrixLocation = glGetUniformLocation(g_program.program, "u_modelViewProjectionMatrix"); g_textureLocation = glGetUniformLocation(g_program.program, "u_texture"); g_vertexLocation = glGetAttribLocation(g_program.program, "a_vertex"); g_texCoordLocation = glGetAttribLocation(g_program.program, "a_texCoord"); g_computeTextureLocation = glGetUniformLocation(g_computeProgram.program, "u_texture"); // // Generate and bind a texture. glGenTextures(1, &g_texture); glBindTexture(GL_TEXTURE_2D, g_texture); // Create an empty image. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, g_imageWidth, g_imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); // Setting the texture parameters. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBindTexture(GL_TEXTURE_2D, 0); // // Use a helper function to create a rectangular plane. glusShapeCreateRectangularPlanef(&plane, (GLfloat) g_imageWidth / 2.0f, (GLfloat) g_imageHeight / 2.0f); // Store the number indices, as we will render with glDrawElements. g_numberIndicesPlane = plane.numberIndices; glGenBuffers(1, &g_verticesVBO); glBindBuffer(GL_ARRAY_BUFFER, g_verticesVBO); glBufferData(GL_ARRAY_BUFFER, plane.numberVertices * 4 * sizeof(GLfloat), (GLfloat*) plane.vertices, GL_STATIC_DRAW); glGenBuffers(1, &g_texCoordsVBO); glBindBuffer(GL_ARRAY_BUFFER, g_texCoordsVBO); glBufferData(GL_ARRAY_BUFFER, plane.numberVertices * 2 * sizeof(GLfloat), (GLfloat*) plane.texCoords, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); // Generate a VBO for the indices. glGenBuffers(1, &g_indicesVBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_indicesVBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, plane.numberIndices * sizeof(GLuint), (GLuint*) plane.indices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Now we can destroy the shape, as all data is now on the GPU. glusShapeDestroyf(&plane); // glUseProgram(g_program.program); glGenVertexArrays(1, &g_vao); glBindVertexArray(g_vao); glBindBuffer(GL_ARRAY_BUFFER, g_verticesVBO); glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(g_vertexLocation); glBindBuffer(GL_ARRAY_BUFFER, g_texCoordsVBO); glVertexAttribPointer(g_texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(g_texCoordLocation); // Also bind the indices to the VAO. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_indicesVBO); // // Also bind created texture ... glBindTexture(GL_TEXTURE_2D, g_texture); // ... and bind this texture as an image, as we will write to it. glBindImageTexture(0, g_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8); // ... and as this is texture number 0, bind the uniform to the program. glUniform1i(g_textureLocation, 0); // glUseProgram(g_computeProgram.program); // Pass texture number 0 to the compute shader as well. glUniform1i(g_computeTextureLocation, 0); // glClearColor(0.0f, 0.0f, 0.0f, 0.0f); return GLUS_TRUE; }