Azz*_*777 5 opengl glsl vertex-shader
我正在使用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
Run Code Online (Sandbox Code Playgroud)
这是我的着色器:
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);
}
Run Code Online (Sandbox Code Playgroud)
如果您需要更多信息,我很乐意遵守.
Nic*_*las 10
你需要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);
Run Code Online (Sandbox Code Playgroud)
您的顶点着色器将采用两个vec4
值作为输入.由于您没有使用glVertexAttrib I指针,OpenGL知道您传递的值将被解释为浮点数.