-1

以下は私のopenglコードです。意味のあることをしないかもしれません。コードで freeglut ライブラリを使用しました。以下はすべてのコードです。

#include <glload/gll.h>
#include <glload/gl_3_0.h>
#include <GL/glut.h>
#include "glfw3.h"

void ChangeSize(int w, int h)
{
    glViewport(0, 0, w, h);
}

void RenderScene(void)
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glLoadIdentity();
    glLineWidth(1);
    glColor3f(1.0f, 0.0f, 0.0f);

    glBegin(GL_LINE);
    glVertex3f(0.0f, 0.0f, 0.5f);
    glVertex3f(0.0f, 1.0f, 0.5f);
    glVertex3f(1.0f, 1.0f, 0.5f);
    glEnd();

    glMatrixMode(GL_PROJECTION);
    glOrtho(-2.0,2.0,-2.0,2.0,-1.0,1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();



}

int main (int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
//  glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
//  glShadeModel(GL_SMOOTH);

    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);

    glutMainLoop();

    return 0;
}

エラーメッセージは次のとおりです。

Unhandled exception at 0x00000000 in HelloGL5.exe: 0xC0000005: Access violation.

2 行のコードをコメントアウトしたため、このエラーが発生していないことに注意してください。これらの 2 行のいずれかをコードに追加すると、このエラーが発生するのはなぜですか?

4

2 に答える 2

2

あなたがコメントで言ったように。

OpenGL 4.4.0 をターゲットにしています

「アクセス違反」エラーが発生する理由は、OpenGL で多くの非推奨関数を使用しているためです。

次の関数は、OpenGL バージョン 3.1 で廃止された関数の一部です。

  • glMatrixMode()
  • glLoadIdentity()
  • glBegin()
  • glEnd()
  • glVertex3*()
  • glTexCoord*()
  • glNormal*()
  • glColor*()

これは、「すべての」OpenGL 関数と、それらが非推奨、削除、コアなどであるかどうかに関する優れたスプレッドシートです。ここをクリックして参照してください。そのように「すべて」と言う理由は、スプレッドシートがThe Khronos Groupではなく、OpenGL を使用している人々によって作成されているためです。

さて、 Matrix Stackが非推奨になった場合、どのようにすればよいのでしょうか、まあ、すべて. 要点は、独自のMatrixStackを構築/計算して制御することです。

行列の計算と行列の変換について読むことができるリンクがいくつかあります。

glBegin()、などの背後にある理由glEnd()は非推奨です。即時モードのレンダリング全体が廃止されたためです。ここで、VBO (および IBO) で VAO を使用することを想定します

VAO

頂点配列オブジェクト (VAO) は、頂点データを指定するために必要なすべての状態をカプセル化する OpenGL オブジェクトです (以下に 1 つの小さな例外があります)。これらは、頂点データの形式と頂点配列のソースを定義します。VAO には配列自体が含まれていないことに注意してください。配列はバッファ オブジェクトに格納されます (以下を参照)。VAO は、既存のバッファー オブジェクトを参照するだけです。

ソース: http://www.opengl.org/wiki/Vertex_Array_Objects#Vertex_Array_Object

VBO

頂点バッファー オブジェクト (VBO) は、頂点配列データのソースとして使用されるバッファー オブジェクトです。これは他のバッファ オブジェクトと同じであり、変換フィードバックまたは非同期ピクセル転送に使用されるバッファ オブジェクトは、頂点配列のソース値として使用できます。

ソース: http://www.opengl.org/wiki/Vertex_Specification#Vertex_Buffer_Object

于 2013-11-02T20:15:05.693 に答える