Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对VBO中的特定三角形使用不同的纹理_C++_Opengl_Textures_Shader - Fatal编程技术网

C++ 对VBO中的特定三角形使用不同的纹理

C++ 对VBO中的特定三角形使用不同的纹理,c++,opengl,textures,shader,C++,Opengl,Textures,Shader,我有9个由三角形组成的四边形,如下所示: 我使用VBO来存储关于它们的数据——它们的位置和纹理坐标 我的问题是-是否可以通过仅使用一个VBO和shader,使四边形5具有与其他四边形不同的纹理 绿色表示纹理1,黄色表示纹理2 到目前为止,我得到了: GLfloat vertices[] = { // Positions 0.0f, 0.0f, ... // Texture coordinates 0.0f, 0.0f, ... }; 我

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

我使用
VBO
来存储关于它们的数据——它们的位置和纹理坐标

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

绿色表示纹理1,黄色表示纹理2

到目前为止,我得到了:

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

    // Texture coordinates
    0.0f, 0.0f, 
    ...
};
我使用
顶点[]
数组创建
VBO
,然后绑定我的第一个纹理
m_纹理1
(我还可以访问第二个-
m_纹理2
),并调用着色器:

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;
}
和片段着色器:

#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);
}

因此,基本上我在这里只使用了一种纹理,因为我不知道如何使用第二种纹理。

可以使用不同的纹理并将其值设置为
统一采样2D tex

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

您必须将绘图调用分为两个:一个用于绿色四边形,另一个用于黄色。 您必须通过为每次调用设置
uniform sampler 2D tex
using来设置要使用的纹理。 最后调用
glDrawArrays
,查找VBO中表示当前调用中正在绘制的绿色或黄色三角形的三角形子集


你也可以考虑使用A,如果你需要画的是你的例子中的图片。在这种情况下,您可以在一次调用中映射一个纹理。

谢谢您的回答。老实说,我有一个纹理,但因为我需要不同的外部和内部纹理样式(GL_REPEAT和GL_CLAMP),所以我将其拆分为两个,但可能只为内部四边形更改这些参数?@蚊子,不,在这种情况下使用两个纹理。当使用多个绘制调用时,最明显的是切换纹理绑定。但是对于多重纹理(所有纹理都以几个单位绑定),您还可以引入一个额外的整数顶点属性,标识要使用的纹理,这允许使用单个绘制调用来完成此操作。@datenwolf您知道有任何在线文章可以帮助我理解您刚才写的内容吗?我知道如何使用多个纹理(glActiveTexture),例如将它们混合在一起,但我不知道如何使用单个绘制调用“定位”特定区域中的第二个纹理(我在中心的四边形)。@您只需添加一个额外的顶点属性(除了位置和纹理坐标)用它代替均匀的tex。