1,创建定点位置和纹理值
纹理值范围[0,1],如果一张图长宽为512*256,则纹理点(0.5, 0.3)表示图片(512*0.5, 256*0.3)处位置。
        glFrontFace(GL_CW);
        glCullFace(GL_BACK);
        glEnable(GL_CULL_FACE);
glFrontFace()函数告诉OpenGL三角形的顶点是按照顺时针顺序定义的,也就是当你看向三角形的正面时,会发现缓冲器中的三角形顶点是顺时针顺序排列的。
glCullFace()告诉GPU剔除三角形的背面,也就是物体的内表面不需要渲染,只渲染外表面。
最后是开启面剔除本身(默认是关闭的)
5,创建纹理对象,加载原始纹理数据
        glGenTextures(1, &m_textureObj);
        glBindTexture(m_textureTarget, m_textureObj);
        glTexImage2D(m_textureTarget, 0, GL_RGBA, m_image.columns(), m_image.rows(), 0, GL_RGBA, GL_UNSIGNED_BYTE, m_blob.data());
        glTexParameterf(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
5,告诉片元使用哪一个纹理对象单元
sampler_location = glGetUniformLocation(shader_program, "gsampler");
glUseProgram(ID);
glUniform1i(sampler_location, 0);//GL_TEXTURE0
glUniform1i(sampler_location2, 1);//GL_TEXTURE1
先将要使用的纹理单元的索引放到shader中的取样器一致变量里。
6,激活指定纹理单元,绑定纹理对象。纹理对象的数据由纹理数据指定。
glActiveTexture(GL_TEXTURE0);
void
												GLAPIENTRY glBindTexture (GLenum
																target, GLuint
																				texture);
//与glUniform1i(sampler_location, 0);对应,激活0号纹理单元,供纹理对象 texture使用。
//glUniform1i(sampler_location, i);glActiveTexture(GL_TEXTUREi);
7 ,
				glEnableVertexAttribArray(0);
						glEnableVertexAttribArray(1);
								glBindBuffer(GL_ARRAY_BUFFER, vbo);
												glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexText), 0);
																						glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexText), (const
																																		GLvoid*)12);
																																				glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
																																								
																																								glActiveTexture(GL_TEXTURE0);//对应上面glUniform1i(sampler_location, 0);
        glBindTexture(GL_TEXTURE_2D, m_textureObj);
glActiveTexture(GL_TEXTURE1);//对应上面glUniform1i(sampler_location2, 1);
        glBindTexture(GL_TEXTURE_2D, m_textureObj2);
        glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);
																																																		glDisableVertexAttribArray(0);
																																																				glDisableVertexAttribArray(1);
主渲染循环中的代码有所添改,在之前启用的用于顶点位置的顶点属性0之后,这里我们启动一个顶点属性1用于纹理坐标。这个和顶点着色器中的layout变量声明是一一对应的。
然后我们调用glVertexAttribPointer函数来定义顶点缓冲器中纹理坐标的位置。
8,

9,
// texture samplers
uniform sampler2D gsampler;
uniform sampler2D gsampler2;
void main()
{
   // linearly interpolate between both textures (80% gsampler, 20% gsampler2)
   FragColor = mix(texture(gsampler, TexCoord), texture(gsampler2, TexCoord), 0.2);
}
当前名称:Opengl_13_纹理贴图-创新互联
URL链接:http://www.scyingshan.cn/article/cddceg.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 