2

解決

問題は z 間隔にありました。(-0.1f < z < 100f) のような z の負の値を検討していましたが、代わりに近/遠面 ex に正の間隔を使用しました: (0.0f < z < 100.0f)、私は配置しましたOpenGL で非推奨の void を持つ他のもの、および glm :: lookAt で自分の悪い位置を調整しました。

注 : 古いレンダリング方法と新しいレンダリング方法を混在させないでください (これは良い方法ですが、問題になる可能性があります)。

みんなありがとう:)


私は初心者のグラフィック プログラマーで、基本的な頂点/フラグメント シェーダーを使用して非常に単純な三角形を描画しようとしていました。しかし、射影行列に 1 つのエラーがあり、それを見つけることができません。また、reshape void を実行しようとしており、reshape コールバックがシェーダーによって描画された三角形でうまく機能することを望んでいます。これらの製品を render void に書き込むと、次のようになります。

MVP = ProjectionMatrix * ModelViewMatrix;

結果 ->好きじゃない

そして、ModelView マトリックスのみを MVP に割り当てると、次のようになります。

結果 ->原点が左上隅にあり、ウィンドウの中央にあるため、私も好きではありません

これらは私のReshape Voidです

void OpenGL_Initialization(int w, int h){
    ProjectionMatrix = glm :: ortho(0.0f,(GLfloat)w,(GLfloat)h,0.0f,0.1f, 100.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glLoadMatrixf(glm :: value_ptr(ProjectionMatrix));
    glMatrixMode(GL_MODELVIEW);
}

void Reshape(int w, int h){
    width  = w;
    height = h;
    glViewport(0,0,w,h);
    OpenGL_Initialization(w,h);
}

そして、これは私のレンダーコールバックです:

void Render(){
    glClearColor(0.75,0.75,0.75,1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glGetFloatv(GL_MODELVIEW_MATRIX,glm :: value_ptr(ModelViewMatrix));

    MVP = ProjectionMatrix * ModelViewMatrix;

    glUniformMatrix4fv(glGetUniformLocation(ProgramHandler,"MVP"),1,GL_FALSE,glm :: value_ptr(MVP));

    glBindVertexArray(vaoHandle);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glBindVertexArray(0);

    glutSwapBuffers();

}

また、これらは私の頂点とフラグメントシェーダーです

#version 400

layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexColor;

uniform mat4 MVP;

out vec3 Color;

void main(){    
    Color = VertexColor;
    gl_Position = MVP*vec4(VertexPosition,1.0);
}

#version 400
in  vec3 Color;
out vec4 FragColor;
void main(){
    FragColor = vec4(Color,1.0);
}

VBO と VAO の初期化:

void InitVBO(GLuint programHandler){
    glBindAttribLocation(programHandler,0,"VertexPosition");
    glBindAttribLocation(programHandler,1,"VertexColor");

    GLfloat positionData[] = {-0.5f,0.5f,0.0f,0.0f,-.5f,0.0f,0,0,0};
    GLfloat colorData[]    = {1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f};

    GLuint vboHandles[2];

    glGenBuffers(2,vboHandles);

    glBindBuffer(GL_ARRAY_BUFFER,vboHandles[0]);
    glBufferData(GL_ARRAY_BUFFER,9*sizeof(GLfloat),positionData,GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER,vboHandles[1]);
    glBufferData(GL_ARRAY_BUFFER,9*sizeof(GLfloat),colorData,GL_STATIC_DRAW);

    glGenVertexArrays(1, &vaoHandle);
    glBindVertexArray(vaoHandle);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, vboHandles[0]);
    glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0,(GLubyte *)NULL );

    glBindBuffer(GL_ARRAY_BUFFER, vboHandles[1]);
    glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0,(GLubyte *)NULL );
}

4

2 に答える 2

2

固定機能のパイプライン(GL1.x) 呼び出しとプログラマブル シェーダー パイプライン呼び出しを組み合わせて使用​​しているようです。おそらくあなたが説明した問題を引き起こしているわけではありませんが、一般に、両方を同時に使用するのではなく、どちらか一方を使用することをお勧めします。

シェーダー プログラムで使用するマトリックスをアップロードする正しい方法は、glUniformMatrix4fv(既に行ったように) を呼び出すことです。ただし、関数内のglMatrixMode,glLoadIdentityおよびのglLoadMatrix呼び出しは、OpenGL_Initialization(int w, int h)実際には、使用しているシェーダー プログラムの状態には影響しません。代わりに、廃止されたマトリックス スタックの状態を変更しています。

同様に、glGetFloatv(GL_MODELVIEW_MATRIX,glm :: value_ptr(ModelViewMatrix))組み込みのマトリックス スタックで使用されるモデルビュー マトリックス データを呼び出しで取得していますが、これにはガベージ データが含まれている可能性があります。

OpenGL_Initialization基本的に、非推奨の機能をすべて捨てて、次のように非常に簡単に機能を再実装することをお勧めします。

void OpenGL_Initialization(int w, int h){
     ProjectionMatrix = glm::ortho(0.0, (GLfloat)w, (GLfloat)h, 0.0, -1.0, 1.0);
}

そして、あなたのレンダリングコールバックでは、あなたはただ行うでしょう

glClearColor(0.75, 0.75, 0.75, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glm::mat4 ModelViewMatrix; // default constructor => identity
MVP = ProjectionMatrix * ModelViewMatrix;

glUseProgram(ProgramHandler); // possibly redundant
GLuint MVP_loc = glGetUniformLocation(ProgramHandler, "MVP");
glUniformMatrix4fv(MVP_loc, 1, GL_FALSE, glm::value_ptr(MVP));

/* draw, swap buffers */
于 2013-08-21T17:40:12.673 に答える
0

コードには 2 つの問題があります。

  1. 三角形は z=0 平面にありますが、near/far を 0.1 と 100 に設定しているため、三角形は視錐台の外にあり、z 値を (-0.1 < z < -100) の範囲に設定する必要があります。
  2. w, h がウィンドウのサイズである場合、ラスタライズ後の三角形は画面上で 1 ピクセルしか占有しません。つまり、画面にはほとんど何も表示されません。ピクセル単位のウィンドウ空間にいると考えることができるので、適切なサイズの三角形が必要です。したがって、この問題の修正として、頂点の位置を大きく変更するか (w/2、h/2、-1、w、h/2、-1、w、h、-1)、またはorth to be glm :: ortho(-1, 1, -1, 1, 0.1f, 100.0f);
于 2013-08-22T14:34:35.277 に答える