OpenGL バージョン 3.2 で、「sampler2DArray」を使用して同じ寸法の複数の画像を格納し、テクスチャ ポイントを使用してそれらをレンダリングするプロジェクトを一度行いました。
現在、そのプロジェクトを gnu/linux コンピューターに移植しようとしています。このコンピュータは、OpenGL バージョン 2.1 までと GLSL バージョン 1.20 までしかサポートしていません (sampler2DArray はありません)。私の知る限り、新しい機能をサポートするために OpenGL を更新する方法はありません。
私が現在やろうとしているのは、sampler3D を使用して画像を保存し、深度値を使用して必要な画像を選択することです。
テクスチャ深度を頂点シェーダーからフラグメント シェーダーに送信するために、深度値 (0.0 から 1.0) を保持する「可変」浮動小数点変数を宣言しました。
(-0.5、+0.5)、(+0.5、+0.5)、(-0.5、-0.5)、(+0.5、-0.5) の場所に 4 つの画像をレンダリングしています。
画像切り替え方法が機能しているようです (「index」変数を変更すると、画像が変更されます)。しかし、何らかの理由で、すべての画像が割り当てられた位置ではなく (0.0, 0.0) にレンダリングされます。この問題は、テクスチャの深度値を含む可変変数に割り当てず、フラグメント シェーダーで深度値を 0.0 に設定すると解消されます。
頂点シェーダーは次のとおりです。
#version 120
attribute vec2 position
attribute float index
varying float v_index
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
v_index = index; // Removing this assignment makes the images appear at their assigned locations.
}
フラグメント シェーダーは次のとおりです。
#version 120
uniform sampler3D texture;
varying float v_index;
void main()
{
gl_FragColor = texture3D(texture, vec3(gl_PointCoord, v_index));
}
私が使用する構造は頂点を表します:
struct vertex {
GLfloat x;
GLfloat y;
GLfloat texture_index;
};
関数の呼び出しglVertexAttribPointer
(問題もここにある可能性があります):
glBindAttribLocation(shader_program, 0, "position");
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct vertex), (void *)0);
glBindAttribLocation(shader_program, 1, "index");
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, sizeof(struct vertex), (void *)(2 * sizeof(GLfloat));
よく似た質問も見つけました。「受け入れられた」とマークされた回答は、問題の原因はシェーダーに16を超えるさまざまなベクトルがあることであると主張しています(これは私には当てはまりません)。
リンクは次のとおりです:異なる頂点シェーダーに属性を割り当てている間、GLSL で奇妙なエラーが発生しました