gpt4 book ai didi

opengl - 将 uint 属性传递给 GLSL

转载 作者:行者123 更新时间:2023-12-03 15:05:14 25 4
gpt4 key购买 nike

我试图将一堆连续的无符号整数作为属性传递给我的 GLSL 着色器。

到目前为止,我想出了

s_number = glGetAttribLocation(shader, "number");

numberData = new GLuint[dotAmount];
for (GLuint i = 0; i < dotAmount; i++) {
numberData[i] = i;
}

glGenBuffers(1, &vertBuf);
glBindBuffer(GL_ARRAY_BUFFER, vertBuf);

glBufferData(
GL_ARRAY_BUFFER,
sizeof(dotAmount),
numberData,
GL_STATIC_DRAW
);

渲染函数是
glUseProgram(shader);

[..]

glEnableVertexAttribArray(s_number);
glBindBuffer(GL_ARRAY_BUFFER, vertBuf);

glVertexAttribPointer(
s_number,
1,
GL_UNSIGNED_INT,
GL_FALSE,
0,
BUFFER_OFFSET(0)
);

glDrawArrays(GL_POINTS, 0, dotAmount);

我尝试在顶点着色器中使用数字,如下所示:
attribute uint number;

(名称“vertBuf”实际上有点误导,因为它不是我想传递的顶点数据)
我正在使用 OpenGL 3 和着色器版本 1.3。

我想要实现的是,我希望执行着色器 dotAmount次。定位是在着色器中以数学方式完成的。但我得到的只是一个空白屏幕......

我很确定问题不在于着色器。我想画点,如果我放 gl_Position = vec4(0.0, 0.0, 0.0, 0.0);在顶点着色器中,我认为它应该绘制一些东西。

最佳答案

您正在使用错误的 API 调用来指定您的顶点属性指针。
glVertexAttribPointer (...)用于浮点顶点属性。它会很高兴地采用整数数据类型的值,但最终这个值将被转换为浮点数。这就是为什么它有一个参数来控制浮点归一化。启用规范化后,您传递的整数值将使用类型的范围进行调整,使其适合规范化的浮点范围:[-1.0, 1.0] (签名)或 [0.0, 1.0] (未签名);当禁用时,一个整数被有效地处理,就好像它被强制转换为 GLfloat .

在您的情况下,您不希望上述任何行为。在您的顶点着色器中,您的顶点属性一开始就不是浮点类型,因此让 OpenGL 将您的顶点数组数据转换为浮点数会产生毫无意义的结果。

您需要做的是使用glVertexAttribIPointer (...) .请注意此函数如何缺少用于规范化的 bool 值?它会将您的整数顶点数据完全不变地传递给您的顶点着色器,这正是您想要的。

总之:

  • glVertexAttribPointer (...)适合为浮点顶点属性(即 vec<N>mat4float )提供数据,并且会为您进行数据类型转换。
  • glVertexAttribIPointer (...)专为整数属性设计(即 ivec<N>{u}int )。
  • 关于opengl - 将 uint 属性传递给 GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18919927/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com