2017-03-26 61 views
0

我试图实施延迟渲染,和我的测试代码已经运行到我无力解决一个问题:纹理采样不正确的UV坐标

我用下面的数据,我的全屏四:

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

这使得像这样:

quad

正如你所看到的,通过的顶点和indices[3]索引indices[5]似乎使用相同的uv坐标,导致四边形的第二个(左上角)三角形中的采样拉伸,但正如您所看到的,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; 
} 

正如你所看到的,没有什么花哨哪些改变文本的着色器因为我不知道为什么会发生这种情况。

更新:

我改性着色器输出R,G(蓝总是零)的颜色基于UV坐标四,和我的初步印象是正确的:为左下角被引用的坐标四是(0,0),这是不正确的:

incorrect

它应该是什么样子,是这样的:

enter image description here

+1

所以,你有两个不同大小的属性数组。您如何首先将此信息发送给GL?顶点是所有属性的集合,而不仅仅是位置,因此您需要6个顶点用于GL。 – derhass

+0

这是一个索引数组,用'glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0)绘制;' –

回答

0

我想出了问题:

法线/纹理坐标/ etc必须与顶点共享相同的索引。我正在安排我的纹理坐标数据为无索引,所以它只使用了texCoords的前4个元素。

一旦我改变了第四个元素与第四个顶点元素相对应,一切正常。