从YouTube复制的OpenGl着色器中的语法错误

吉安·拉格(Gian Laager)

我尝试学习OpenGl,现在我想在黑色背景上制作一个带有顶点和着色器的简单红色三角形。我复制了该YouTube视频中的代码我改变了看法。那是我的代码:

#include "prec.h"
struct Vector2
{
    float x, y;
};

struct TrianglePos
{
    Vector2 a, b, c;
};

static unsigned int CompileShader(unsigned int type, const std::string& source)
{
    unsigned int id = glCreateShader(type);
    const char* src = source.c_str();
    glShaderSource(id, 1, &src, nullptr);
    glCompileShader(id);

    int result;
    glGetShaderiv(id, GL_COMPILE_STATUS, &result);
    if (!result)
    {
        int length;
        glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
        char* message = (char*)alloca(length * sizeof(char));
        glGetShaderInfoLog(id, length, &length, message);
        std::cout << "Failed to compile shader, message: " << message << std::endl;
        glDeleteShader(id);
        return 0;
    }

    return id;
}

static unsigned int createShader(const std::string& vertexShader, const std::string& fragmentShader)
{
    unsigned int program = glCreateProgram();
    unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
    unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);

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

    glDeleteShader(vs);
    glDeleteShader(fs);

    return program;
}

int main() {

    if (!glfwInit())
        return -1;


    GLFWwindow *window = glfwCreateWindow(640, 480, "Sand Box GL", NULL, NULL);

    if (!window) {
        std::cout << "problems with window" << std::endl;
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    if (GLEW_OK != glewInit()) {
        std::cout << "something with glew went wrong" << std::endl;
        return -1;
    }


    TrianglePos trianglePos = {
            -0.5f, -0.5f,
            0.0f, 0.5f,
            0.5f, -0.5f
    };

    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(trianglePos), &trianglePos, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), 0);

    std::string vertexShader =
            "#version 400 core\n"
            "\n"
            "layout(location = 0) in vec4 position;\n"
            "\n"
            "void main() \n"
            "{\n"
            "   gl_Position = position;\n"
            "}\n";

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

    const char *versionGL;
    versionGL = (char *) (glGetString(GL_VERSION));
    std::cout << "openGl version: " << versionGL << std::endl;

    if(GL_VERSION_4_0)
        std::cout << "opengl 4.0 supported" << std::endl;

    unsigned int shader = createShader(vertexShader, fragmentShader);
    glUseProgram(shader);

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

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window);

        glfwPollEvents();
    }
    glfwTerminate();
    return 0;
}

那就是预编译的头文件(prec.h):#pragma

#ifndef GLEWINIT_PREC_H
#define GLEWINIT_PREC_H
#endif //GLEWINIT_PREC_H

#include "GL/glew.h"
#include <GLFW/glfw3.h>

#include <iostream>

程序将其打印到控制台(“支持OpenGL 4.0”表示GL_VERSION_4_0 == true):

openGl version: 2.1 INTEL-14.5.22 
opengl 4.0 supported

当我尝试运行它时,我从顶点和片段着色器的着色器编译器收到以下错误消息:

ERROR: 0:1: '' :  version '400' is not supported
ERROR: 0:1: '' : syntax error: #version
ERROR: 0:3: 'layout' : syntax error: syntax error

当我将更#version 400 core改为时#version 120,只会得到的语法错误layout因此,我想我弄乱了一些东西。我可以尝试什么?

拉比德76

您的系统不支持OpenGL 4.0。它仅支持OpenGL 2.1。查看输出

openGl version: 2.1 INTEL-14.5.22 

GLSL 1.20对应于OpenGL 2.1。降级着色器:

顶点着色器

#version 120

attribute vec4 position;

void main()
{
    gl_Position = position;
}

片段着色器

#version 120

void main()
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

分别使用Raw字符串文字C ++ 11):

std::string vertexShader =
R"(#version 120

attribute vec4 position;

void main()
{
    gl_Position = position;
}
)";

std::string fragmentShader =
R"(#version 120

void main()
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
)";

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL ES2:在顶点着色器(iOS)中使用“ layout”关键字时语法错误

来自分类Dev

未捕获的错误:'if':语法错误。一个着色器中的两个旋转矩阵

来自分类Dev

Unity着色器:解析器错误:第19行的语法错误

来自分类Dev

为什么此GLSL着色器产生语法错误?

来自分类Dev

OpenGL的SFML着色器错误

来自分类Dev

OpenGL着色器版本错误

来自分类Dev

OpenGL着色器版本错误

来自分类Dev

片段着色器引发的OpenGL错误

来自分类Dev

LWJGL Opengl着色器错误

来自分类Dev

着色器中的多个[in]属性-OpenGL

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

获取0:1(1):错误:语法错误,尝试编译着色器时出现意外的$ end

来自分类Dev

当我的着色器文件的所有信息都正确读入字符串并且在语法上正确时,OpenGL为什么会给出语法错误

来自分类Dev

OpenGL不报告着色器编译器错误

来自分类Dev

OpenGL:在着色器中实现的 Blinn-Phong 模型给出错误的结果

来自分类Dev

镶嵌着色器-OpenGL

来自分类Dev

OpenGL着色器输入

来自分类Dev

镶嵌着色器-OpenGL

来自分类Dev

OpenGL着色器输入

来自分类Dev

着色器创建Opengl

来自分类Dev

OpenGL工作着色器?

来自分类Dev

编译时的OpenGL着色器生成器错误

来自分类Dev

顶点着色器和片段着色器如何在OpenGL中通信?

来自分类Dev

顶点着色器或片段着色器中的OpenGL ES2.0 Lighting

来自分类Dev

如何在OpenGL / GLES着色器中添加指令?

来自分类Dev

如何提高OpenGL着色器中的纹理访问性能?

来自分类Dev

在OpenGL中渲染数据:顶点和计算着色器

来自分类Dev

OpenGL着色器程序中的重复顶点

Related 相关文章

热门标签

归档