2016-11-28 58 views
0

我有一個項目使用浮動工作正常,我已經改變它使用雙打而不是浮動,它不再工作。我覺得這可能是我的頂點佈局,現在頂點有3個位置雙打,3個正常雙打和2個texCoord浮點數。下圖是否看起來像是頂點佈局/步幅/尺寸問題?對我來說看起來很奇怪。這看起來像是一個頂點屬性/佈局問題嗎?

enter image description here

這裏是我的頂點結構:

struct Vertex 
{ 
    glm::dvec3 position; // 24 bytes 
    glm::dvec3 normal;  // 24 bytes 
    glm::vec2 texCoords; // 8 bytes 
}; On the CPU there is no padding. Shader side there would be for a block, but for attributes I don't think it matters. 

我的頂點着色器看起來是這樣的:

layout (location = 0) in dvec3 position;   
layout (location = 2) in dvec3 vertNormal; 
layout (location = 4) in vec2 vertTexCoords; 
layout (location = 0) out dvec3 fragWorldPos; 
layout (location = 2) out dvec3 fragNormal; 
layout (location = 4) out vec2 fragTexCoords; 

我的片段着色器:

layout (location = 0) flat in dvec3 fragWorldPos; 
layout (location = 2) flat in dvec3 fragNormal; 
layout (location = 4) in vec2 fragTexCoords; 
layout (location = 5) out vec4 outFragColour; 

而且我VERT ex屬性:

glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, 56, (void*)nullptr); 
    glEnableVertexAttribArray(0); 

    glVertexAttribPointer(1 (should be 2?), 3, GL_DOUBLE, GL_FALSE, 56, (void*)(3 * sizeof(double))); 
    glEnableVertexAttribArray(1); //Should be ? 

    glVertexAttribPointer(2 (should be 4?), 2, GL_FLOAT, GL_FALSE, 56, (void*)(48)); 
    glEnableVertexAttribArray(2); //Should be ? 

它基本上看起來像是什麼時候發生,當你的顯卡即將死亡。它閃爍很多。

+0

Offtopic - 這個奇特的調試GUI是什麼? – Starl1ght

+0

@ Starl1ght它被稱爲ImGUI,它是更受歡迎的即時模式GUI之一,相當簡單,並且對於它的功能非常好,但我不是整個即時模式的粉絲。你能推薦一些好的嗎?我還沒有試過AntTweak吧。最終我會想要一些更漂亮的遊戲,並有更多的功能。 – Zebrafish

+0

@TitoneMaurice:你沒有向着色器發送任何64位浮點數,你告訴GL將其轉換爲首先浮動,並將其作爲'dvec'訪問只是未定義的行爲。見例如[這個問題](http://stackoverflow.com/questions/10823811/glsl-double-precision-vertex-buffer)和[這個問題](http://stackoverflow.com/questions/28014864/why-詳細信息請參閱glvertexattribpointer-do-exist的不同變體)。 – derhass

回答

0
  1. location在頂點着色器必須匹配glVertexAttribPointerglEnableVertexAttribArray。所以,頂點着色器必須被編輯。

  2. afaik,您不應指定頂點着色器中out參數的位置以及片段着色器中的任何參數,它們應該按名稱原樣傳遞。

+0

謝謝。我明確使用位置的原因是因爲我使用綁定到管道對象的單獨程序。我認爲這是一個更新的特性,讓您可以混合和匹配不同的着色器程序,並且匹配規則有點不同。所以該位置必須匹配vertexAttrib函數?因爲在文檔中他們稱之爲索引。這很好。我改變了它,但沒有解決問題。我沒有在着色器中更改它,因爲在着色器中它們需要爲0,2和4,因爲dvec需要兩個位置。這真的很難。 – Zebrafish

+1

是的,然後在vertexAttrib功能中匹配它。 – Starl1ght

+0

你使用過Vulkan嗎?我知道Vulkan比OpenGL更難,但是在我和你之間,我並不特別喜歡OpenGL。 – Zebrafish

相關問題