gpt4 book ai didi

opengl - 为什么这个 GLSL Vertex Shader 不能编译?

转载 作者:行者123 更新时间:2023-12-04 17:27:13 24 4
gpt4 key购买 nike

我正在用 OpenGL 编写我自己的着色器,我很困惑为什么这个着色器不能编译。其他人可以看看吗?

我作为顶点传入的是以下格式的 2 个浮点数(以字节分隔):

Float 1:

Byte 1: Position X
Byte 2: Position Y
Byte 3: Position Z
Byte 4: Texture Coordinate X


Float 2:

Byte 1: Color R
Byte 2: Color G
Byte 3: Color B
Byte 4: Texture Coordinate Y

这是我的着色器:
in vec2 Data;
varying vec3 Color;
varying vec2 TextureCoords;

uniform mat4 projection_mat;
uniform mat4 view_mat;
uniform mat4 world_mat;

void main()
{
vec4 dataPosition = UnpackValues(Data.x);
vec4 dataColor = UnpackValues(Data.y);

vec4 position = dataPosition * vec4(1.0, 1.0, 1.0, 0.0);
Color = dataColor.xyz;

TextureCoords = vec2(dataPosition.w, dataColor.w)

gl_Position = projection_mat * view_mat * world_mat * position;
}

vec4 UnpackValues(float value)
{
return vec4(value % 255, (value >> 8) % 255, (value >> 16) % 255, value >> 24);
}

如果您需要更多信息,我很乐意遵守。

最佳答案

您需要申报UnpackValues在你打电话之前。 GLSL 就像 C 和 C++;名称在使用前必须有声明。

顺便说一句:你试图做的事情是行不通的。浮点数就是浮点数;除非您使用 GLSL 4.00(并且由于您继续使用诸如“变化”之类的旧术语,我猜不会),否则您无法从浮点数中提取位。事实上,右移运算符只为整数定义;尝试在浮点数上使用它会因编译器错误而失败。

GLSL 不是 C 或 C++(讽刺的是)。

如果你想打包你的数据,使用OpenGL为你打包。发送两个包含规范化无符号字节的 vec4 属性:

glVertexAttribPointer(X, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, *);
glVertexAttribPointer(Y, 4, GL_UNSIGNED_BYTE, GL_TRUE, 8, * + 4);

你的顶点着色器需要两个 vec4值作为输入。由于您没有使用 glVertexAttribIPointer,OpenGL 知道您正在传递将被解释为浮点数的值。

关于opengl - 为什么这个 GLSL Vertex Shader 不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6784849/

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