十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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);
}