我有9个由三角形组成的四边形,如下所示:
我正在使用VBO
存储有关它们的数据 - 它们的位置和纹理坐标。
我的问题是 - 是否可以通过仅使用一个VBO
和shader
使四边形5具有与其他四边形不同的纹理? :
绿色代表纹理1,黄色代表纹理2.
到目前为止,我得到了:
GLfloat vertices[] = {
// Positions
0.0f, 0.0f,
...
// Texture coordinates
0.0f, 0.0f,
...
};
我正在使用VBO
数组创建vertices[]
,然后我绑定了我的第一个纹理m_texture1
(我也可以访问第二个 - {{1} })并调用着色器:
m_texture2
我的顶点着色器:
glBindTexture(GL_TEXTURE_2D, m_texture1);
glUseProgram(program);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboId); // for vertex coordinates
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); // Vertices
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)(sizeof(GLfloat)*108)); // Texture
glDrawArrays(GL_TRIANGLES, 0, 108);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUseProgram(0);
片段着色器:
#version 330
layout (location = 0) in vec4 position;
layout (location = 1) in vec2 texcoord;
out vec2 Texcoord;
void main()
{
gl_Position = position;
Texcoord = texcoord;
}
所以基本上我只在这里使用那个纹理,因为我不知道如何使用第二个纹理。
答案 0 :(得分:2)
您可以使用不同的texture image units并将其值设置为uniform sampler2D tex
来执行此操作。
你必须调用glActiveTexture并设置纹理图像单元(GL_TEXTURE0),绑定绿色纹理,然后将活动纹理设置为GL_TEXTURE1并绑定黄色纹理。这样,绿色纹理将具有纹理图像单元ID 0和黄色1。
您必须将绘图调用拆分为两个:一个用于绿色四边形,另一个用于黄色。
您必须通过为每个调用使用glUniform1i设置uniform sampler2D tex
来设置要使用的纹理。
最后调用glDrawArrays
获取VBO中三角形的子集,指示您在当前调用中绘制的绿色或黄色三角形。
如果您需要绘制的只是示例中的图片,您可以考虑使用texture atlas。在这种情况下,您将在一次调用中映射一个纹理。