gpt4 book ai didi

opengl - glUniform/glVertexAttribPointer 类型必须匹配着色器中声明的类型吗?

转载 作者:行者123 更新时间:2023-12-01 00:26:45 25 4
gpt4 key购买 nike

GLSL 代码和传递数据的 native 代码之间的类型必须匹配到什么程度?

例如,假设我有着色器代码:

uniform float uFloat;
uniform int uInt;
in float aFloat;
in int aInt;

和原生伪代码(我省略了很多无聊的东西):

glUniform1i(glUniformLocation("uFloat"), 10)
glUniform1f(glUniformLocation("uInt"), 1.414)
glBufferData(int[1, 2, 3, ...])
glVertexAttribPointer(glAttribLocation("aFloat"), 0, GL_INT)
glBufferData(float[1.1, 2.2, 3.3, ...])
glVertexAttribPointer(glAttribLocation("aInt"), 0, GL_FLOAT)

因此请注意类型在客户端代码中匹配,但它们与着色器代码中声明的类型不匹配。

我想问的是,您是在逻辑层面还是在位表示方面告诉着色器值?

(我知道我似乎应该能够对此进行测试,但是很难调试着色器,而且我觉得我的行为不一致,所以我只是在寻找确定的信息。)

最佳答案

type参数 glVertexAttribPointer指定缓冲区内数据的类型。如果它是整数类型,则在读取顶点时,GPU 会自动将这些值转换为浮点值,如果 normalized,则直接将它们转换为浮点值。是GL_FALSE ,或者如果 normalized,则将它们除以整数类型的最大值是GL_TRUE .

然而,glVertexAttribPointer仅适用于 in float输入(即使你传递了一个整数缓冲区类型),但在你的最后一行,你将它与 in int 一起使用.为此,您必须使用 glVertexAttribIPointer (注意 I )。虽然它有一个 type参数,它不接受浮点格式,如 GL_FLOAT ;您不能将浮点值缓冲区传递给整数顶点属性。

(对于 glVertexAttribLPointer 也有 double,但不经常使用。)

制服更加严格;您必须使用适当的 glUniform您正在使用的类型的函数(例如 glUniform1i 用于 int 类型和 glUniform1f 用于 float 类型),否则您会得到一个 GL_INVALID_OPERATION错误。

关于opengl - glUniform/glVertexAttribPointer 类型必须匹配着色器中声明的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26512546/

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