我尝试实现延迟呈现,而我的测试代码遇到了一个我无法解决的问题:
我将以下数据用于我的全屏四核:
glm::vec3 verts[] = {
glm::vec3(-1.0f,-1.0f,0.0f), //0
glm::vec3( 1.0f,-1.0f,0.0f), //1
glm::vec3( 1.0f, 1.0f,0.0f), //2
glm::vec3(-1.0f, 1.0f,0.0f) }; //3
glm::vec2 texCoords[] = {
glm::vec2(0.0f,1.0f),
glm::vec2(1.0f,1.0f),
glm::vec2(1.0f,0.0f),
glm::vec2(0.0f,1.0f),
glm::vec2(1.0f,0.0f),
glm::vec2(0.0f,0.0f) };
unsigned int indices[] = { 0,1,2,0,2,3 };
其中呈现如此:
如您所见,由indices[3]
和indices[5]
索引的顶点似乎使用相同的uv坐标,导致四边形的第二个(左上角)三角形中的采样拉伸,但你也可以看到,紫外线数据很好(尽管垂直翻转)。
我已经使用Nsight来检查存储在图形内存缓冲区中的数据,以确认全屏四边形的数据是否正确,并且在下面的着色器执行期间肯定会发生错误:
顶点着色器:
#version 430
// Some drivers require the following
precision highp float;
layout (location = 0)in vec3 MSVertex;
layout (location = 4)in vec2 MSTexCoord;
out xferBlock
{
vec3 VSVertex;
vec2 VSTexCoord;
} outdata;
void main()
{
outdata.VSVertex = MSVertex;
outdata.VSTexCoord = MSTexCoord;
gl_Position = vec4(MSVertex,1.0);
}
片段着色器:
#version 430
// Some drivers require the following
precision highp float;
layout (location = 2) uniform sampler2D colourMap;
layout (location = 4) uniform sampler2D glowMap;
out vec4 colour;
in xferBlock
{
vec3 VSVertex;
vec2 VSTexCoord;
} indata;
void main()
{
vec4 dcolour = texture(colourMap, indata.VSTexCoord).rgba;
vec4 gcolour = texture(glowMap, indata.VSTexCoord).rgba;
colour = dcolour*gcolour;
}
正如你所看到的那样,改变纹理坐标的着色器没什么特别之处,所以我不知道为什么会发生这种情况。
更新
我修改着色器以根据四边形的UV坐标输出R,G(蓝色始终为零)颜色,并且我的初始印象是正确的:四边形的左角引用的坐标是(0,0 ),这是不正确的:
应该是什么样的,是这样的:
答案 0 :(得分:0)
我发现了问题:
法线/纹理坐标/等必须与顶点共享相同的索引。我正在安排我的纹理坐标数据没有索引,所以它只使用texCoords
的前4个元素。
一旦我将第4个元素更改为与第4个顶点元素对应,一切正常。