2

色を 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 ビットでぎっしり詰まっています。

4

2 に答える 2