【发布时间】: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 question 和 this question。
标签: c++ opengl glsl shader vertex