在VBO中为特定三角形使用不同的纹理

Pio*_*cki 6 c++ opengl shader textures

我有9个由三角形组成的四边形,如下所示:

在此输入图像描述

我正在使用它VBO来存储有关它们的数据 - 它们的位置和纹理坐标.

我的问题是 - 是否可以通过仅使用一个VBO和四个来使四边形5具有与其他四边形不同的纹理shader?:

在此输入图像描述

绿色代表纹理1和黄色 - 纹理2.

到目前为止我得到了:

GLfloat vertices[] = { 
    // Positions
    0.0f, 0.0f,
    ...

    // Texture coordinates
    0.0f, 0.0f, 
    ...
};
Run Code Online (Sandbox Code Playgroud)

我正在VBO使用该vertices[]数组创建,然后我绑定我的第一个纹理m_texture1(我也可以访问第二个 - 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);
Run Code Online (Sandbox Code Playgroud)

我的顶点着色器:

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec2 texcoord;

out vec2 Texcoord;

void main()
{
    gl_Position = position;
    Texcoord = texcoord;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 330

in vec2 Texcoord;

out vec4 outputColor;

uniform sampler2D tex;

void main()
{
    outputColor = texture(tex, Texcoord) * vec4(1.0,1.0,1.0,1.0);
}
Run Code Online (Sandbox Code Playgroud)

所以基本上我只在这里使用一个纹理,因为我不知道如何使用第二个纹理.

Kim*_*imi 3

您可以使用不同的纹理图像单元并将它们的值设置为 来完成此操作uniform sampler2D tex

您必须调用glActiveTexture并设置纹理图像单元(GL_TEXTURE0),绑定绿色纹理,然后将活动纹理设置为 GL_TEXTURE1 并绑定黄色纹理。这样你的绿色纹理将具有纹理图像单元 ID 0 和黄色 1。

您必须将绘图调用分为两部分:一个用于绿色四边形,另一个用于黄色。您必须通过为每次调用设置“uniform sampler2D tex使用glUniform1i”来设置要使用的纹理。最后调用glDrawArraysVBO 中的三角形子集,指示您在当前调用中绘制的绿色或黄色三角形。

如果您需要绘制的只是示例中的图片,您也可以考虑使用纹理图集。在这种情况下,您将在一次调用中映射一个纹理。

  • 当使用多个绘制调用时,显而易见的事情就是切换纹理绑定。但对于多重纹理(所有纹理绑定在多个单元中),您还可以引入一个附加的整数顶点属性,标识要使用的纹理,这允许使用单个绘制调用来完成此操作。 (2认同)