Почему этот GLSL Vertex Shader не скомпилируется? - PullRequest
5 голосов
/ 22 июля 2011

Я пишу свой собственный шейдер с 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);
}

Если вам нужна дополнительная информация, я был бы рад выполнить.

1 Ответ

10 голосов
/ 22 июля 2011

Вам нужно объявить 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 в качестве входных данных.Поскольку вы не используете glVertexAttrib I Pointer, OpenGL знает, что вы передаете значения, которые должны интерпретироваться как числа с плавающей запятой.

...