色を 4 つのフロートとしてシェーダーに送信できます - 問題ありません。ただし、整数(または符号なし整数、実際には重要ではありません。重要なのは32ビットです)として送信し、シェーダーのvec4で分解したいと考えています。
私は OpenTK を OpenGL の C# ラッパーとして使用しています (ただし、それはほとんど直接のラッパーである必要があります)。
位置 (xyz) と色 (rgba) を含む頂点を持つ最も単純なシェーダーの 1 つを考えてみましょう。
頂点シェーダー:
#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 では、VertexBufferArray があり、データが分離されているため、ストライドとして 0 を渡しています。そのため、色は頂点ごとに (色ごとに) 32 ビットでぎっしり詰まっています。