c++ - OpenGL 翻译错误,C1068 和 C2003

标签 c++ opengl glsl translation glm-math

我已经开始学习 OpenGL 教程,这节​​课是关于使用 glm 平移三角形。但是,每当我编译程序时,都会出现以下错误

0(9) : error C1068: too much data in type constructor
(0) : error C2003: incompatible options for link`.

再次强调,我是 OpenGL 的新手,并且 本教程适用于 3.6 版,而我使用的是 4.6 版,所以我不知道这是否可能是个问题,这里是代码希望你能帮助我(顺便说一句,全部在一页上)。

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

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"
#include "glm/gtc/type_ptr.hpp"

#include <iostream>


//Window dimensions
const GLint SCREEN_WIDTH = 1280, SCREEN_HEIGHT = 900;

GLuint VAO, VBO, shader, uniformModel;

bool isMovingLeft = true; 
float triOffset = 0.f;
float triMaxOffset = 0.7;
float triIncrement = 0.005;



//Vertex shader
static const char* vShader = "\n\
    #version 460 \n\
    \n\
    layout(location = 0) in vec3 pos; \n\
    \n\
    uniform mat4 model; \n\
    \n\
    void main() { \n\
        gl_Position = vec4(0.4 * pos.x + model, 0.4 * pos.y, pos.z, 1.0); \n\
    }; \n\
";

//Fragment shader
static const char* fShader = "\n\
    #version 460 \n\
    \n\
    out vec4 color; \n\
    \n\
    void main() { \n\
        color = vec4(0.f, 1.f, 0.f, 1.f); \n\
    }; \n\
";


void createTriangle() {
    //Vertices of the triangle 
    GLfloat vertices[] = {
        -1.f, -1.f, 0.f,
         1.f, -1.f, 0.f,
         0.f,  1.f, 0.f
    };

    //Binding it
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);


    //Information
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);


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

}

void addShader(GLuint theProgram, const char* shaderCode, GLenum shaderType) {
    GLuint theShader = glCreateShader(shaderType);

    const GLchar* theCode[1];
    theCode[0] = shaderCode;

    GLint codeLength[1];
    codeLength[0] = strlen(shaderCode);

    glShaderSource(theShader, 1, theCode, codeLength);
    glCompileShader(theShader);


    //Getting error information for linking
    GLint result = 0;
    GLchar eLog[1024] = { 0 };

    glGetProgramiv(theShader, GL_COMPILE_STATUS, &result);
    if (result != GL_FALSE) {
        glGetShaderInfoLog(theShader, sizeof(eLog), NULL, eLog);
        std::cout << "Error compiling the " << shaderType << ' ' << eLog << '\n';
    }


    glAttachShader(theProgram, theShader);

}

void compileShaders() {
    shader = glCreateProgram();

    if (shader != GL_TRUE) {
        std::cout << "Shader program error!\n";
    }

    //Adding shaders
    addShader(shader, vShader, GL_VERTEX_SHADER);
    addShader(shader, fShader, GL_FRAGMENT_SHADER);

    //Getting error information for linking
    GLint result = 0;
    GLchar eLog[1024] = { 0 };

    //Linking shader
    glLinkProgram(shader);

    //Shader linking status
    glGetProgramiv(shader, GL_LINK_STATUS, &result);
    if (result != GL_TRUE) {
        glGetProgramInfoLog(shader, sizeof(eLog), NULL, eLog);
        std::cout << "Error linking program! " << eLog << '\n';
    }


    //Gets shader ID and then combines `uniformModel` with `model`
    uniformModel = glGetUniformLocation(shader, "model");
}


int main() {
    //Initialize GLFW
    if (glfwInit() != GLFW_TRUE) {
        std::cout << "GLFW init failed\n";
        glfwTerminate();
    }


    //Setup GLFW window properties
    //OpenGL version
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); //Large version
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4); //Small version 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //Detects any old OpenGL code, this will throw an error
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //Allows forward compatibility (between differnt OS) 


    //Creating window
    GLFWwindow* window;
    window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "OpenGL Test Window", NULL, NULL);
    glfwSetWindowPos(window, 250, 100);

    if (window == NULL) {
        std::cout << "GLFW window creation failed!\n";
        glfwTerminate();
    }

    //Get buffer size information
    int bufferWidth, bufferHeight;
    glfwGetFramebufferSize(window, &bufferWidth, &bufferHeight);

    //Set context for GLEW to use (can change between which window)
    glfwMakeContextCurrent(window);

    //Allow modern extension features
    glewExperimental = GL_TRUE;


    if (glewInit() != GLEW_OK) {
        std::cout << "Glew init failed!\n";
        glfwDestroyWindow(window);
        glfwTerminate();
    }


    //Setup viewport size
    glViewport(0, 0, bufferWidth, bufferHeight);

    createTriangle();
    compileShaders();


    //Main game loop
    while (!glfwWindowShouldClose(window)) {
        //Get + Handle user input events
        glfwPollEvents();

        if (isMovingLeft) {
            triOffset += triIncrement;
        }
        else {
            triOffset -= triIncrement;
        }

        if (abs(triOffset) >= triMaxOffset) {
            isMovingLeft = !isMovingLeft;
        }


        //Clear window
        glClearColor(0.f, 0.f, 0.f, 1.f);
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(shader);

        //Matrix 4x4
        glm::mat4 model;
        model = glm::translate(model, glm::vec3(triOffset, triOffset, 0.f));

        glUniformMatrix4fv(uniformModel, 1, GL_FALSE, glm::value_ptr(model));


        glBindVertexArray(VAO);

        glDrawArrays(GL_TRIANGLES, 0, 6);

        glBindVertexArray(0);
        glUseProgram(0);


        glfwSwapBuffers(window);
    }
}

最佳答案

统一的模型mat4类型。您必须通过顶点着色器中的矩阵转换顶点坐标:

gl_Position = vec4(0.4 * pos.x + model, 0.4 * pos.y, pos.z, 1.0);`

gl_Position = model * vec4(0.4 * pos.x, 0.4 * pos.y, pos.z, 1.0);

您没有得到错误,因为 addShader 中存在问题。着色器对象的编译错误可以通过glGetShaderiv得到。而不是 glGetProgramiv .如果着色器编译成功,那么结果是 GL_TRUE 而不是 GL_FALSE:

glGetShaderiv(theShader, GL_COMPILE_STATUS, &result);
if (result != GL_TRUE) {
    glGetShaderInfoLog(theShader, sizeof(eLog), NULL, eLog);
    std::cout << "Error compiling the " << shaderType << ' ' << eLog << '\n';
}

此外 glm::mat4 模型; 给出了一个未初始化的矩阵。获得 Identity matrix您必须将单个标量 (1.0) 传递给矩阵构造函数:

glm::mat4 model(1.0f);

关于c++ - OpenGL 翻译错误,C1068 和 C2003,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58717262/

相关文章:

GLSL-左右移位操作问题

c++ - 可变参数模板与类中的函数参数数量相同

opengl - 如何查询OpenGL模板缓冲区的深度

c++ - opengl 纹理无法正确渲染

c++ - 计算顶点法线时出现问题(在 C++ 中,用于 openGL 项目)

ios - GLSL ES Phong 着色器结果中的设备/操作系统不一致

c++ - 在 OpenGL 中渲染混合线

c++ - boost 序列化 Armadillo 矩阵

c++ - std::hex/std::oct 不工作(打印十进制值)

OpenGL 可编程管线点光源