Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复OpenGL 3.3中的黑屏输出 我在项目中使用OpenGL和C++进行了一个黑屏。我需要帮助,因为我在屏幕上渲染红色三角形时出错了_C++_Opengl_Glsl_Glfw - Fatal编程技术网

如何修复OpenGL 3.3中的黑屏输出 我在项目中使用OpenGL和C++进行了一个黑屏。我需要帮助,因为我在屏幕上渲染红色三角形时出错了

如何修复OpenGL 3.3中的黑屏输出 我在项目中使用OpenGL和C++进行了一个黑屏。我需要帮助,因为我在屏幕上渲染红色三角形时出错了,c++,opengl,glsl,glfw,C++,Opengl,Glsl,Glfw,我已尝试检查顶点和片段着色器中的错误 #include <GL\glew.h> #include <GL\GL.h> #include <GLFW\glfw3.h> #include <iostream> #include <string> using namespace std; unsigned int CreateShader(int type, const string shaderSource) { unsigne

我已尝试检查顶点和片段着色器中的错误

#include <GL\glew.h>
#include <GL\GL.h>
#include <GLFW\glfw3.h>
#include <iostream>
#include <string>

using namespace std;

unsigned int CreateShader(int type, const string shaderSource) {
    unsigned int shader = glCreateShader(type);
    const char *src = shaderSource.c_str();
    glShaderSource(shader, 1, &src, NULL);
    glCompileShader(shader);

    int result;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &result);
    if (result == GL_FALSE) {
        int length;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
        char *message = (char*)alloca(length * sizeof(char));
        glGetShaderInfoLog(shader, length, &length, message);
        cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex shader " : "fragment shader ") << endl;
        cout << message << endl;
    }


    return shader;
}

unsigned int CreateProgram(const string vertexShader, const string fragmentShader) {
    unsigned int program = glCreateProgram();

    unsigned int vs = CreateShader(GL_VERTEX_SHADER, vertexShader);
    unsigned int fs = CreateShader(GL_FRAGMENT_SHADER, fragmentShader);

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

    glDeleteShader(vs);
    glDeleteShader(fs);

    glLinkProgram(program);
    glValidateProgram(program);

    return program;

}

int main() {

    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow *window = glfwCreateWindow(800, 600, "window", NULL, NULL);

    glfwMakeContextCurrent(window);

    glewInit();
    if (glewInit() != GLEW_OK) {
        cout << "Glew initialization Failed! " << endl;
        glfwTerminate();
        return -1;
    }

    float positions[] = {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f, 0.5f, 0.0f,
    };

    cout << "Made By Rial Seebran" << endl;
    cout << glfwGetVersionString() << endl;


    unsigned int VAO;
    unsigned int VBO;

    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

    const string vertexShader =
        "#version 330 core\n"
        "layout (location = 0) in vec3 position;\n"
        "void main() {\n"
        "gl_Position = vec4(position, 0.0f);\n"
        "}\n";

    const string fragmentShader =
        "#version 330 core\n"
        "layout (location = 0) out vec4 color;\n"
        "void main() {\n"
        "color = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
        "}\n";

    unsigned int program = CreateProgram(vertexShader, fragmentShader);


    while (!glfwWindowShouldClose(window)) {
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(program);
        glBindVertexArray(VAO);
        glDrawArrays(GL_ARRAY_BUFFER, 0, 3);
        glBindVertexArray(0);

        glfwPollEvents();
        glfwSwapBuffers(window);
    }
    glfwTerminate();
    return 0;
}
我希望在蓝色背景指定的坐标处绘制一个红色三角形。

第一个参数必须是基元类型。 它必须是GL_三角形,而不是GL_数组\u缓冲区:

glDrawArraysGL_数组_缓冲区,0,3; GLDRAWARRAYSGLU三角形,0,3

OpenGL枚举器常量GL_ARRAY_BUFFER不是此参数的可接受值,它将导致GL_INVALID_枚举错误。此错误可以通过以下方式获得

将剪辑空间坐标转换为规格化设备空间时,x、y和z分量将除以w分量。 这意味着gl_位置的w分量必须设置为1.0,而不是0.0:

gl_位置=矢量4位置,0.0f; gl_位置=矢量4位置,1.0

Glew可以通过glewExperimental=GL_TRUE;启用其他扩展;。请参见以下说明:

GLEW从图形驱动程序获取有关受支持扩展的信息。但是,实验或预发布驱动程序可能不会通过标准机制报告所有可用的扩展,在这种情况下,GLEW将报告它不受支持。为了避免这种情况,可以通过在调用glewInit之前将glewExperimental全局开关设置为GL_TRUE来打开它,从而确保所有具有有效入口点的扩展都将被公开

glewExperimental=GL_TRUE; 如果你喜欢它好的{ cout第一个参数必须是基元类型。 它必须是GL_三角形,而不是GL_数组\u缓冲区:

glDrawArraysGL_数组_缓冲区,0,3; GLDRAWARRAYSGLU三角形,0,3

OpenGL枚举器常量GL_ARRAY_BUFFER不是此参数的可接受值,它将导致GL_INVALID_枚举错误。此错误可以通过以下方式获得

将剪辑空间坐标转换为规格化设备空间时,x、y和z分量将除以w分量。 这意味着gl_位置的w分量必须设置为1.0,而不是0.0:

gl_位置=矢量4位置,0.0f; gl_位置=矢量4位置,1.0

Glew可以通过glewExperimental=GL_TRUE;启用其他扩展。请参阅说明:

GLEW从图形驱动程序获取有关受支持扩展的信息。但是,实验或预发布驱动程序可能不会通过标准机制报告每个可用扩展,在这种情况下,GLEW将报告它不受支持。要避免这种情况,可以通过将glewExperimental全局开关设置为在调用glewInit之前,GL_为TRUE,这确保所有具有有效入口点的扩展都将被公开

glewExperimental=GL_TRUE; 如果glewInit!=GLEW_正常{ 库特