ubuntu 13でGLを使用し、nvidia ION2でeeepcを使用して基本的なビューマネージャーを作成しています(バンブルビープロジェクトを使用して最適化されています)。システムの起動時に(プラグインのように)シェーダーが作成され、辞書に追加される XML ファイルがあります。これらがコンパイルおよびリンクされ、使用できるようになると、ラッパー関数を使用して、渡されたプログラム名に基づいて適切なシェーダー プログラムが選択されます。
void ShadingProgramManager::useProgram(const std::string& program){
GLuint id = getProgramId(program);
glUseProgram(id);
if(GL_INVALID_VALUE == glGetError() || GL_INVALID_OPERATION == glGetError()){
printf("Problem Loading Shader Program");
return;
}
printf("%s is in use", program.c_str());
}
getProgramId は、事前に作成されたディクショナリ内を調べて、シェーダー プログラムの ID を返すだけです。
オブジェクトをレンダリングするときは、次のように呼び出してプログラムを使用します。
ShadingProgramManager::getInstance()->useProgram('vc');
「vc」は次のシェーダーで構成されています
頂点シェーダー - vc.vert
#version 330
layout(location = 0) in vec3 position;
layout(location = 1) in vec4 color;
out vec4 vertcolor;
void main(){
vertcolor = color;
gl_Position = vec4(position, 1.0); //I've tried setting this as position * 10 also for any apparent changes on screen, but nothing changes
}
フラグメント シェーダー - vc.frag:
#version 330
in vec4 vertcolor;
out vec4 outputcolor;
void main(){
outputcolor = vertcolor;
}
私の頂点バッファは次のようにインターリーブされています。
VertexColor vertices[] =
{
{-1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0}, /*first 3 floats for pos, 4 for color */
{ 1.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0},
{ 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0},
{-1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0},
};
インデックス バッファは次のとおりです。
GLuint indices[] =
{
0, 1, 2,
0, 2, 3,
};
VertexColor は次のように定義されます。
class VertexColor{
GLfloat x;
GLfloat y;
GLfloat z;
GLfloat r;
GLfloat g;
GLfloat b;
GLfloat a;
/** some constants as below **/
};
const int VertexColor::OFFSET_POSITION =0;
const int VertexColor::OFFSET_COLOR =12;
const int VertexColor::SIZE_POSITION =3;
const int VertexColor::SIZE_COLOR =4;
const int VertexColor::STRIDE =28;
次に、次のコードを使用してクワッドをレンダリングします。
ShadingProgramManager::getInstance()->useProgram('vc');
glBindBuffer(GL_ARRAY_BUFFER, &vb);
glBufferData(GL_ARRAY_BUFFER, size_of_vertices_array, vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, &ib);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size_of_indices_array, indices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribArrayPointer(0, VertexColor::SIZE_POSITION, GL_FLOAT, GL_FALSE, VertexColor::STRIDE, (GLvoid*)VertexColor::OFFSET_POSITION);
glVertexAttribArrayPointer(1, VertexColor::SIZE_COLOR, GL_FLOAT, GL_FALSE, VertexColor::STRIDE, (GLvoid*)VertexColor::OFFSET_COLOR);
glDrawElements(GL_TRIANGLES, size_of_indices, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
ただし、白いクワッドしか見えません。有効になるのは固定機能パイプラインだと思います。
glUseProgram(id) の呼び出しを削除したり、glUseProgram(0) を使用したりしても、同じ結果が得られます。また、頂点シェーダーの位置に 10.0 を掛けてみましたが、画面には影響しませんでした。シェーダーもコンパイルおよびリンクされていると確信しています。glUseProgram(40) などの無効な数値を使用するように変更すると、必要なエラー メッセージが表示されますが、それ以外の場合は白い単位の正方形しか表示されません。
非常に長い投稿で申し訳ありませんが、私はこれに困惑しています... vert または frag シェーダーにどのような変更を加えても、白い単位正方形が表示されます。GL がデフォルトで FFP になっていると思われますが、何らかの理由でシェーダー プログラムが有効になりません。私はそれが初心者の間違いであることを望んでいますが、どんな指針もいただければ幸いです。
PS: コンパイル エラーはありませんので、コードの構文エラーはご容赦ください。上記の完全なコードを入力しました。
更新: Andon、Dinesh、Spektre によって提案されたように、glVertexAttribArrayPointer への呼び出しに最後のパラメーターを追加しましたが、以前は見逃していましたが、結果は同じでした。