简体   繁体   English

无法在OpenGL C ++中渲染三角形

[英]Can't render triangle in OpenGL C++

I've tried to follow this tutorial for OpenGL in C but when it comes to the second tutorial, the one that is supposed to draw a triangle on the window, I couldn't see anything. 我已经尝试在C中使用OpenGL的这个教程,但是当谈到第二个教程时,那个应该在窗口上绘制三角形的教程,我看不到任何东西。 So this is what I did, I took the code that creates the OpenGL context, window and stuff and I tried to make it simpler: instead of using VAO I tried glBegin/glEnd. 所以这就是我所做的,我采用了创建OpenGL上下文,窗口和东西的代码,我试图让它变得更简单:我没有使用VAO,而是尝试了glBegin / glEnd。

I get this error: 1282 "invalid operation". 我收到此错误:1282“无效操作”。 I'm just using the same sentences taking directly from my LWJGL project. 我只是直接从我的LWJGL项目中使用相同的句子。 The main loop is so simple I can't understand how it does not work and the 1282 error is not giving me any information. 主循环是如此简单,我无法理解它是如何工作的,1282错误没有给我任何信息。 Why do I still get an error? 为什么我仍然会收到错误?

#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "glfw3.lib")
#pragma comment(lib, "glew32s.lib")
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

// Include GLEW. Always include it before gl.h and glfw.h, since it's a bit magic.
#define GLEW_STATIC
#include <GL/glew.h>

// Include GLFW
#include <GLFW/glfw3.h>

// Include GLM
#include <glm/glm.hpp>
using namespace glm;

void checkErrors() {
    int error = glGetError();
    if (error != GL_NO_ERROR) {
        printf("%s (%d)\n", gluErrorString(error), error);
    }
}

int main(void)
{
    // Initialise GLFW
    if (!glfwInit())
    {
        fprintf(stderr, "Failed to initialize GLFW\n");
        return -1;
    }

    glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want OpenGL 3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don't want the old OpenGL 

    // Open a window and create its OpenGL context 
    GLFWwindow* window; // (In the accompanying source code, this variable is global) 
    window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
    if (window == NULL){
        fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window); // Initialize GLEW 
    glewExperimental = true; // Needed in core profile 
    if (glewInit() != GLEW_OK) {
        fprintf(stderr, "Failed to initialize GLEW\n");
        return -1;
    }

    // Ensure we can capture the escape key being pressed below
    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

    do{
        glClear(GL_COLOR_BUFFER_BIT);

        glBegin(GL_TRIANGLES);
            glVertex3f(-1.0f, -1.0f, 0.0f);
            glVertex3f( 1.0f, -1.0f, 0.0f);
            glVertex3f( 0.0f,  1.0f, 0.0f);
        glEnd();

        // Swap buffers
        glfwSwapBuffers(window);
        glfwPollEvents();

        // Check for errors
        checkErrors();

    } // Check if the ESC key was pressed or the window was closed
    while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
    glfwWindowShouldClose(window) == 0);

    return 0;
}

glBegin / glEnd , along with all other immediate mode drawing functions and some more, have been deprecated, and cannot be used with an OpenGL 3.1 (and up) core and forward compatible contexts. glBegin / glEnd以及所有其他立即模式绘制函数等等已被弃用,不能与OpenGL 3.1(及更高版本)核心和转发兼容的上下文一起使用。

You can try requesting a 3.0 compatibility context (which includes all of the deprecated functionality). 您可以尝试请求3.0兼容性上下文(包括所有已弃用的功能)。 To do this, remove the glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 为此,请删除glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); and glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); lines, and change the minor version hint to 0. Indeed, according to the OpenGL wiki , you should not explicitly request a forward compatible context with 3.1 and newer anyway. 线条,并将次要版本提示更改为0.实际上,根据OpenGL wiki ,您不应该明确请求3.1及更新版本的前向兼容上下文。 However, your best bet is to figure out what's wrong with the VAO code instead of mucking around with deprecated functionality. 但是,最好的办法是找出VAO代码的错误,而不是使用已弃用的功能。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM