Я могу отправить цвет шейдеру как 4 поплавка - без проблем. Однако я хочу отправить его как целое число (или целое число без знака, на самом деле не имеет значения, что имеет значение 32 бита) и разложить в vec4 на шейдер.
Я использую OpenTK в качестве оболочки C # для OpenGL (хотя это должна быть просто прямая оболочка).
Давайте рассмотрим один из самых простых шейдеров с вершинами, содержащими позицию (xyz) и цвет (rgba).
Вершинный шейдер:
#version 150 core
in vec3 in_position;
in vec4 in_color;
out vec4 pass_color;
uniform mat4 u_WorldViewProj;
void main()
{
gl_Position = vec4(in_position, 1.0f) * u_WorldViewProj;
pass_color = in_color;
}
Фрагмент шейдера:
#version 150 core
in vec4 pass_color;
out vec4 out_color;
void main()
{
out_color = pass_color;
}
Давайте создадим буфер вершин:
public static int CreateVertexBufferColor(int attributeIndex, int[] rawData)
{
var bufferIndex = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, bufferIndex);
GL.BufferData(BufferTarget.ArrayBuffer, sizeof(int) * rawData.Length, rawData, BufferUsageHint.StaticDraw);
GL.VertexAttribIPointer(attributeIndex, 4, VertexAttribIntegerType.UnsignedByte, 0, rawData);
GL.EnableVertexAttribArray(attributeIndex);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
return bufferIndex;
}
И я получаю все нули для vec4 'in_color' в вершинном шейдере. Не уверен, что не так.
Ближайшая вещь, которую я нашел: https://www.opengl.org/discussion_boards/showthread.php/198690-I-cannot-send-RGBA-color-as-unsigned-int.
Также в VertexAttribIPointer я передаю 0 как шаг, потому что у меня есть VertexBufferArray и храню данные разделенными. Цвета плотно упакованы по 32 бита (на цвет) на вершину.