簡體   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