【问题标题】:Does this look like a vertex attribute/layout issue?这看起来像顶点属性/布局问题吗?
【发布时间】:2016-11-28 18:45:50
【问题描述】:

我有一个使用浮点数运行良好的项目,我已将其更改为使用双精度数而不是浮点数,但它不再工作了。我有一种感觉,这可能是我的 Vertex 的布局,现在 Vertex 有 3 个位置双精度数、3 个普通双精度数和 2 个 texCoord 浮点数。下面的图像看起来像这是一个顶点布局/步幅/大小问题吗?我觉得很奇怪。

这是我的顶点结构:

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;

还有我的顶点属性:

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 ? 

它基本上看起来像当你的显卡即将死机时会发生什么。经常闪烁。

【问题讨论】:

  • Offtopic - 这个花哨的调试 GUI 是什么?
  • @Starl1ght 它被称为 ImGUI,它是更流行的即时模式 GUI 之一,它相当小、简单、好用,但我不喜欢整个即时模式。你能推荐一些好的吗?我没试过 AntTweak 吧。最终我会想要一些更漂亮、功能更多的游戏。
  • @TitoneMaurice:您没有向着色器发送任何 64 位浮点数,而是告诉 GL 首先将其转换为浮点数,并且以 dvec 的形式访问它只是未定义的行为。有关详细信息,请参阅例如 this questionthis question

标签: c++ opengl glsl shader vertex


【解决方案1】:
  1. 顶点着色器中的location 必须匹配glVertexAttribPointerglEnableVertexAttribArray。因此,必须编辑顶点着色器。

  2. afaik,您不应该为顶点着色器中的out 参数指定位置,对于片段着色器中的任何参数,它们应该按原样按名称传递。

【讨论】:

  • 谢谢。我明确使用位置的原因是因为我使用绑定到管道对象的单独程序。我认为这是一个比较新的功能,可以让你混合匹配不同的着色器程序,匹配规则有点不同。那么位置必须与 vertexAttrib 函数匹配?因为在文档中他们称之为索引。很高兴知道。我改变了它,但它没有解决问题。我没有在着色器中更改它,因为在着色器中它们需要为 0、2 和 4,因为 dvec 需要两个位置。这真的很难。
  • 是的,然后在 vertexAttrib 函数中匹配它。
  • 你用过Vulkan吗?我知道 Vulkan 比 OpenGL 更难,但就你我而言,我并不是特别喜欢 OpenGL。
  • @TitoneMaurice 从来没有使用过它,但是 afaik,Vulkan 要复杂得多,因为它暴露了很多底层的东西,隐藏在 OpenGL 中
  • @Starl1ght: "您不应该为顶点着色器中的 out 参数和片段着色器中的任何参数指定位置,它们应该按原样按名称传递。"废话。 Interfaces can match by location too,给定适当的 OpenGL 版本。更何况FS输出位置have to be mapped to color attachments,所以指定它们是相当重要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多