繁体   English   中英

纹理采样不正确的uv坐标

[英]Texture sampling incorrect uv coordinate

我试图实现延迟渲染,但是我的测试代码遇到了我无法解决的问题:

我将以下数据用于全屏四边形:

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坐标,从而导致四边形的第二个(左上)三角形中的采样拉伸,但是您也可以看到,则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),其中是不正确的:

不正确

它应该是什么样的:

在此处输入图片说明

我解决了这个问题:

法线/纹理坐标/等都必须与顶点共享相同的索引。 我将纹理坐标数据安排为未索引,因此仅使用texCoords的前四个元素。

一旦更改了第4个元素以使其与第4个顶点元素相对应,一切就正常了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM