0

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 への呼び出しに最後のパラメーターを追加しましたが、以前は見逃していましたが、結果は同じでした。

4

2 に答える 2

0

問題が解決しました。

はい、それは単純な間違いでしたが、すべてのコメントは、コード全体をもう一度実行するのに役立ちました. FFPでやり直し、PFPに移行するところから始めました。だからここにエラーがあります:

シェーダープログラム用に作成中のディクショナリに入れ忘れglAttachShader(pid, sid)ていたため、プログラムが有効な間はバーテックスシェーダーとフラグシェーダーが適用されていませんでした。

于 2013-10-31T07:03:08.987 に答える
0

この行を見てください

glVertexAttribArrayPointer(1, VertexColor::SIZE_COLOR, GL_FLOAT, GL_FALSE, VertexColor::STRIDE);

配列内の最初の汎用頂点属性の最初のコンポーネントのオフセットを指定します。頂点配列のカラー データは 4 番目の位置から始まります。カラー データの最初のコンポーネントの開始位置を指定する必要があります。初期ポインタ値は 0 であるため、プログラムは色データではない 1 番目の位置から 4 番目の位置までの色データを読み取ります。しかし、プログラムは頂点データを最初の位置から正しい値である 3 番目の位置まで読み取るため、頂点データを正しく読み取ります。

于 2013-10-30T11:45:52.333 に答える