OpenGL GLFW、三角形がレンダリングされない

Theelf111

macOSで三角形をレンダリングしようとしましたが、機能しません。

これが私のコードです:

#include <iostream>
#include <glm/glm.hpp>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

void OnError(int errorCode, const char* msg){
    throw std::runtime_error(msg);
}

int main(){
    glfwSetErrorCallback(OnError);
    if (!glfwInit()){
        throw std::runtime_error("glfwInit failed");
    }
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(512, 512, "Title", NULL, NULL);
    if (!window){
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK){
        glfwTerminate();
        return -1;
    }

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    float points[] = {
        0.0, 0.5, 0.0,
        -0.5, -0.5, 0.0,
        0.5, -0.5, 0.0
    };

    GLuint vbo = 0;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

    GLuint vao = 0;
    glGenBuffers(1, &vao);
    glBindVertexArray(vao);
    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    const char* vertex_shader =
    "#version 410\n"
    "in vec3 vp;"
    "void main(){"
    " gl_Position = vec4(vp, 1.0);"
    " };";

    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vs, 1, &vertex_shader, NULL);
    glCompileShader(vs);

    const char* fragment_shader =
    "#version 410\n"
    "out vec4 frag_colour;"
    "void main(){"
    " frag_colour = vec4(0.0, 1.0, 0.0, 1.0);"
    " };";

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fs, 1, &fragment_shader, NULL);
    glCompileShader(fs);

    GLuint shader_program = glCreateProgram();
    glAttachShader(shader_program, fs);
    glAttachShader(shader_program, vs);
    glLinkProgram(shader_program);

    while (!glfwWindowShouldClose(window)){
        //glViewport(0, 0, 512, 512);
        //glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glUseProgram(shader_program);
        glBindVertexArray(vao);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glBindVertexArray(0);
        glfwSwapBuffers(window);

        glfwPollEvents();
        glClear(GL_COLOR_BUFFER_BIT);
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glDisableVertexAttribArray(0);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}
Rabbid76

頂点配列オブジェクト名は、次ではglGenVertexArraysなくによって生成する必要がありますglGenBuffers

glGenBuffers(1, &vao);

glGenVertexArrays(1, &vao);

状態頂点配列の指定と有効化状態は、頂点配列オブジェクトに格納されます。オブジェクト名を作成し、頂点配列オブジェクトをバインド(作成)します。次に、頂点配列を指定して有効にすることができます。

GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

ジオメトリを描画する前に、頂点配列オブジェクトをバインドするだけで十分です。

while (!glfwWindowShouldClose(window))
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(shader_program);

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

    glfwSwapBuffers(window);
    glfwPollEvents();
}

アプリケーションでは、コアプロファイルOpenGLコンテキストが作成されることに注意してくださいGLFW_OPENGL_CORE_PROFILE)。これにより、デフォルトの頂点配列オブジェクト(0)が無効になります。頂点配列オブジェクトの
ような命令glVertexAttribPointerglEnableVertexAttribArray状態の変更。この関数が呼び出されたときに名前付き頂点配列オブジェクトがバインドされていない場合、これによりINVALID_OPERATIONエラーが発生します。


さらに、3.2コアプロファイルのOpneGLコンテキストを作成しました。OpenGL3.2に対応するGLSLバージョンは1.50です。
頂点シェーダーとフラグメントシェーダーのバージョン仕様を変更します。

#version 410

#version 150

最後の三角形:


シェーダーのコンパイルが成功したかどうか、およびプログラムオブジェクトが正常にリンクされたかどうかを確認することをお勧めします。

シェーダーのコンパイルが成功したかどうかglGetShaderivは、パラメーターで確認できますGL_COMPILE_STATUS例えば:

#include <iostream>
#include <vector>
bool CompileStatus( GLuint shader )
{
    GLint status = GL_TRUE;
    glGetShaderiv( shader, GL_COMPILE_STATUS, &status );
    if (status == GL_FALSE)
    {
        GLint logLen;
        glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &logLen );
        std::vector< char >log( logLen );
        GLsizei written;
        glGetShaderInfoLog( shader, logLen, &written, log.data() );
        std::cout << "compile error:" << std::endl << log.data() << std::endl;
    }
    return status != GL_FALSE;
}

プログラムのリンクが成功したかどうかglGetProgramivは、パラメータで確認できますGL_LINK_STATUS例えば:

bool LinkStatus( GLuint program )
{
    GLint status = GL_TRUE;
    glGetProgramiv( program, GL_LINK_STATUS, &status );
    if (status == GL_FALSE)
    {
        GLint logLen;
        glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logLen );
        std::vector< char >log( logLen );
        GLsizei written;
        glGetProgramInfoLog( program, logLen, &written, log.data() );
        std::cout << "link error:" << std::endl << log.data() << std::endl;
    }
    return status != GL_FALSE;
}

シェーダーをコンパイルした後、それぞれプログラムをリンクして関数を呼び出します。

GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vertex_shader, NULL);
glCompileShader(vs);
CompileStatus(vs);

GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fragment_shader, NULL);
glCompileShader(fs);
CompileStatus(fs);

GLuint shader_program = glCreateProgram();
glAttachShader(shader_program, fs);
glAttachShader(shader_program, vs);
glLinkProgram(shader_program);
LinkStatus(shader_program);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OpenGLでレンダリングされた予期しない三角形

分類Dev

OpenGLの三角形がレンダリングされていません

分類Dev

C ++でのOpenGL基本三角形レンダリングが機能しない

分類Dev

OpenGL(3)の三角形がlwjglを使用してレンダリングされないのはなぜですか?

分類Dev

AIDE OpenGL es2.0の三角形はレンダリングされません

分類Dev

OpenGL法線が三角形に表示されない

分類Dev

openglとGLFW3の単純な三角形の描画、三角形が見えない

分類Dev

テッセレーション後に三角形が表示されないのはなぜですか?OpenGL

分類Dev

OpenGL:指定された三角形の予期しない頂点位置

分類Dev

OpenGLの不要な三角形--- Zファイティング?

分類Dev

OpenGL描画三角形が表示されない+ glClearColorが画面の色を設定しない

分類Dev

OpenGLコアプロファイルのウィンドウに赤い三角形が表示されないのはなぜですか?

分類Dev

この OpenGL の例で三角形が描画されないのはなぜですか?

分類Dev

Python OpenGLは、四辺形のすべての三角形をレンダリングするわけではありません

分類Dev

OpenGL4.5ダイレクトステートアクセス三角形をレンダリング-GL_INVALID_VALUE

分類Dev

三角形が正しくレンダリングされない

分類Dev

OpenGL描画三角形

分類Dev

頂点に基づくopenGLのさまざまな色の三角形のフラットシェーディング

分類Dev

OpenGL付きの基本的なLWJGL三角形

分類Dev

OpenGL を使用した基本的な三角形の描画

分類Dev

OpenGLで三角形を使用して複雑なポリゴンを描画しようとするとエラーが発生する

分類Dev

Openglの三角形は描かれていません

分類Dev

このOpenGLプログラムはなぜ三角形を描かないのですか?

分類Dev

OpenGLで通常のグリッドの補完的な三角形を動的に作成します

分類Dev

シェーダーを使用して「頂点カラー」の三角形をレンダリングするときのOpenGL「ブラックスクリーン」

分類Dev

OpenGLで三角形を回転させるにはどうすればよいですか?

分類Dev

Android NDKOpenGLESが三角形をレンダリングしない

分類Dev

頂点シェーダーのOpenGlで宣言されていない識別子、頂点シェーダーで三角形を描画するのに問題があります

分類Dev

C ++ Openglの三角形が描画されているか、まったく表示されていません

Related 関連記事

  1. 1

    OpenGLでレンダリングされた予期しない三角形

  2. 2

    OpenGLの三角形がレンダリングされていません

  3. 3

    C ++でのOpenGL基本三角形レンダリングが機能しない

  4. 4

    OpenGL(3)の三角形がlwjglを使用してレンダリングされないのはなぜですか?

  5. 5

    AIDE OpenGL es2.0の三角形はレンダリングされません

  6. 6

    OpenGL法線が三角形に表示されない

  7. 7

    openglとGLFW3の単純な三角形の描画、三角形が見えない

  8. 8

    テッセレーション後に三角形が表示されないのはなぜですか?OpenGL

  9. 9

    OpenGL:指定された三角形の予期しない頂点位置

  10. 10

    OpenGLの不要な三角形--- Zファイティング?

  11. 11

    OpenGL描画三角形が表示されない+ glClearColorが画面の色を設定しない

  12. 12

    OpenGLコアプロファイルのウィンドウに赤い三角形が表示されないのはなぜですか?

  13. 13

    この OpenGL の例で三角形が描画されないのはなぜですか?

  14. 14

    Python OpenGLは、四辺形のすべての三角形をレンダリングするわけではありません

  15. 15

    OpenGL4.5ダイレクトステートアクセス三角形をレンダリング-GL_INVALID_VALUE

  16. 16

    三角形が正しくレンダリングされない

  17. 17

    OpenGL描画三角形

  18. 18

    頂点に基づくopenGLのさまざまな色の三角形のフラットシェーディング

  19. 19

    OpenGL付きの基本的なLWJGL三角形

  20. 20

    OpenGL を使用した基本的な三角形の描画

  21. 21

    OpenGLで三角形を使用して複雑なポリゴンを描画しようとするとエラーが発生する

  22. 22

    Openglの三角形は描かれていません

  23. 23

    このOpenGLプログラムはなぜ三角形を描かないのですか?

  24. 24

    OpenGLで通常のグリッドの補完的な三角形を動的に作成します

  25. 25

    シェーダーを使用して「頂点カラー」の三角形をレンダリングするときのOpenGL「ブラックスクリーン」

  26. 26

    OpenGLで三角形を回転させるにはどうすればよいですか?

  27. 27

    Android NDKOpenGLESが三角形をレンダリングしない

  28. 28

    頂点シェーダーのOpenGlで宣言されていない識別子、頂点シェーダーで三角形を描画するのに問題があります

  29. 29

    C ++ Openglの三角形が描画されているか、まったく表示されていません

ホットタグ

アーカイブ