2

何らかの理由で、三角形に z インデックスを設定できないことを検出できません。三角形は同じ深さで 1 から -1 (両端を含む) まで表示されますが、その後は消えます。私は MVP マトリックスを適用していません (これを最初に把握しようとしています)。z 値を減らすと、三角形が小さくなることがわかると思います。これは私がこれまでに持っているものです:

//My main function
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_ALPHA|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(640, 480);
glutCreateWindow("Window");

if (init_resources()) {
    glutDisplayFunc(onDisplay);
    glutIdleFunc(idle);
    glEnable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMainLoop();
}

//And in my display function
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

そして私の頂点シェーダーで:

gl_Position = vec4(coord2d, 0.0, 1.0);

glGetIntegerv(GL_DEPTH_BITS, &depth)24 も返します。

編集:完全なコード

Sprite *sprite1;
Sprite *sprite2;

GLuint program;
GLuint cameraAttribute;

int init_resources()
{   

    //Link shaders, create program and attach shaders
    GLint link_ok = GL_FALSE;
    GLuint vs, fs;
    if ((vs = create_shader("vertShader.sh", GL_VERTEX_SHADER))   == 0) return 0;
    if ((fs = create_shader("fragShader.sh", GL_FRAGMENT_SHADER)) == 0) return 0;

    program = glCreateProgram();
    glAttachShader(program, vs);
    glAttachShader(program, fs);


    glLinkProgram(program);
    glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
    if (!link_ok) {
        fprintf(stderr, "glLinkProgram:");
        print_log(program);
        return 0;
    }

    //Create Attributes
    cameraAttribute = glGetUniformLocation(program, "camera");
    if(cameraAttribute == -1){
        cout << "Error!";
    }


    //Init sprites
    sprite1 = new Sprite();
    sprite2 = new Sprite();


    return 1;
}

void onDisplay()
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glUseProgram(program);


    sprite1->render();
    sprite2->render();

    glutSwapBuffers();
}

void idle()
{

    //Create Projection Matrix to change clip space.
    mat4 projectionMatrix = perspective(60.0f, (float)glutGet(GLUT_WINDOW_WIDTH) / (float)glutGet(GLUT_WINDOW_HEIGHT), 0.1f, 100.f);
    glUniformMatrix4fv(cameraAttribute, 1, GL_FALSE, &projectionMatrix[0][0]);

}

void free_resources()
{
    glDeleteProgram(program);
}


int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA|GLUT_ALPHA|GLUT_DOUBLE|GLUT_DEPTH);
    glutInitWindowSize(640, 480);
    glutCreateWindow("My Second Triangle");
    glEnable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);

    if (init_resources()) {
        glutDisplayFunc(onDisplay);
        glutIdleFunc(idle);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        //uses glGetError to check for how many errors there are.
        cout << CheckGLErrors() << "\n";

        glutMainLoop();
    }


    free_resources();
    return 0;
}

そして私のスプライトファイル:

#include "Sprite.h"

Sprite::Sprite(){
    init();
}


void Sprite::init(){

    GLfloat triangle_vertices[] = {
        0.0,  0.8f,
        -0.8f, -0.8f,
        0.8f, -0.8f,
    };

    //Set attributes
    locationAttribute = glGetAttribLocation(program, "coord2d");
    if (locationAttribute == -1) {
        fprintf(stderr, "Could not bind attribute location");
    }

    translationUniform = glGetUniformLocation(program, "translationUniform");
    if(translationUniform == -1){
        fprintf(stderr, "Could not bind attribute transformation");
    }


    //Create buffer
    glGenBuffers(1, &mainBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, mainBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(
                          locationAttribute, // attribute
                          2,                 // number of elements per vertex, here (x,y)
                          GL_FLOAT,          // the type of each element
                          GL_FALSE,          // take our values as-is
                          0,                 // no extra data between each position
                          0                  // offset of first element
    );

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void Sprite::render(){
    glBindBuffer(GL_ARRAY_BUFFER, mainBuffer);
    glDrawArrays(GL_TRIANGLES, 0, 3);

}

頂点シェーダー: (注、バージョンはパーサーによって追加されます)

attribute vec2 coord2d;

uniform mat4 translationUniform;
uniform mat4 camera;


void main(void) {

    gl_Position = camera * vec4(coord2d, -1.1, 1.0);
}
4

2 に答える 2

3

わかりました、質問を読み直しました。今は理解できたと思います。

三角形は -1 対 1 の外では消えます。これは、射影行列がないと、-1 対 1 のニア クリップ プレーンとファー クリップ プレーンを持つ正規化されたデバイス座標で描画されるためです。これは、z 値が -1 の外側にある頂点を意味します。から 1 までがカリングされます。

第二に、あなたはそれが距離とともに小さくなるのを見ないと言います。これは透視投影の機能であり、持っていません (投影行列がないため)。デフォルトの射影行列 (正射投影) では、遠近法の縮みは発生しないため、三角形は距離に関係なく同じサイズで表示されます。シーンにパースペクティブを適用したい場合は、パースペクティブ マトリックスが必要です。適用gluPerspective(1, 45, 0.1, 100);してみると、期待どおりのものが得られるはずです (三角形は -0.1 から -100 までの z で表示され、z= に近づくにつれて小さくなります)。 -100)。シーンのスケールに合わせてこれらを調整する必要がある場合があります。

于 2012-06-14T01:35:59.523 に答える
3

glEnable(GL_BLEND | GL_DEPTH_TEST);

これらをこのように組み合わせることはできません。2 つの glEnable コマンドを発行する必要があります。これはおそらくエラーを生成しているか、まったく別のものを有効にしています。

これを、ビット単位のマスクを使用する glClear と混同しています。

コードで使用を開始するglGetErrorと、この問題が発生します。

于 2012-06-14T01:06:42.127 に答える