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
C++ 在顶点着色器中声明统一后OpenGL未渲染_C++_Opengl_Glsl - Fatal编程技术网

C++ 在顶点着色器中声明统一后OpenGL未渲染

C++ 在顶点着色器中声明统一后OpenGL未渲染,c++,opengl,glsl,C++,Opengl,Glsl,我又开始玩现代OpenGL(4.1),在我进入阴影领域之前一切都很好 但在我使用着色渲染某些东西之前,顶点着色器出现了一些问题 这个程序非常简单,它只读取一个OBJ文件和网格的纹理。我把这些东西放在各自的缓冲区里,然后画出来。起初它完美地绘制了所有内容,但后来我在顶点着色器和BAM中又添加了两个uniform变量!什么都不画。有趣的是:只要我评论一件额外的制服,所有的东西都会重新渲染 我真的不明白这里发生了什么,我以为我是在推断制服的极限,但它只是3件mat4制服,从我的谷歌搜索结果来看,我至少

我又开始玩现代OpenGL(4.1),在我进入阴影领域之前一切都很好

但在我使用着色渲染某些东西之前,顶点着色器出现了一些问题

这个程序非常简单,它只读取一个OBJ文件和网格的纹理。我把这些东西放在各自的缓冲区里,然后画出来。起初它完美地绘制了所有内容,但后来我在顶点着色器和BAM中又添加了两个
uniform
变量!什么都不画。有趣的是:只要我评论一件额外的制服,所有的东西都会重新渲染

我真的不明白这里发生了什么,我以为我是在推断制服的极限,但它只是3件
mat4
制服,从我的谷歌搜索结果来看,我至少有1024件[]

不管怎样,我没有主意,没有谷歌查询,所以我来这里帮助你。 提前谢谢

啊,我正在使用MacOSX El Captain和一些环境信息(从glGetString获得): 版本:4.1 ATI-1.40.16 渲染器:AMD Radeon HD 6750M OpenGL引擎

有些代码不包括上下文创建和着色器编译。 注意,如果我删除
uniformmat4mm它工作得很好。否则,它将继续打印“位置->-1”(表示找不到任何统一的位置)。
我真的不知道发生了什么事

另外,请不要介意糟糕的代码,仍然试图找出一些代码仍然不好的东西

vertexShader.gs:

#version 410
layout(location = 0) in vec3 vPosition;
layout(location = 1) in vec2 vTex;

out vec2 texCoord;

uniform mat4 mM;
uniform mat4 mV;
uniform mat4 mvp;

void main () {
    texCoord = vTex;

    gl_Position = mvp * vec4(vPosition, 1.0f);
}
Main.cpp

#include <iostream>
#include <string>
#include <vector>

#include <OpenGl/gl.h>
//#define GLFW_INCLUDE_GLCOREARB
#include <GLFW/glfw3.h>

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

#include "picg.h"
#include "shader.h"
#include "tiny_obj_loader.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

void matrices(GLfloat xAngle, GLfloat yAngle);

glm::mat4 projection, view, model, rotations;
glm::mat4 mvp;
glm::vec3 light;

GLuint vao, vbo, ibo, tbo;
GLuint texture;
GLuint shaderProgram;

const GLfloat angle = 1.0f;

GLfloat cYAngle;
GLfloat cXAngle;
GLfloat scale = 1.0f;

GLfloat points[] = {
    -0.7f, +0.7f, +0.7f,
    -0.7f, -0.7f, +0.7f,
    +0.7f, -0.7f, +0.7f,
    +0.7f, +0.7f, +0.7f
};

GLuint indices[] = {
    0, 1, 2, 3, 0, 2
};

int main() {
    GLFWwindow * window = create_context("Fish club", 600, 600);
    initGL();

    GLubyte vertexShader = shaderFromFile("vertexShader.gs", GL_VERTEX_SHADER);
    GLubyte fragmentShader = shaderFromFile("fragmentShader.gs", GL_FRAGMENT_SHADER);

    projection = glm::perspective(glm::radians(+45.f), 1024.f / 768.f, 0.1f, 600.0f);

    view = glm::lookAt(
            glm::vec3(+0.0f,+0.0f,+5.0f),
            glm::vec3(+0.0f,+0.0f,+0.0f),
            glm::vec3(+0.0f,+1.0f,+0.0f)
    );

    model = glm::mat4(1.0f);
    model = glm::scale(model, glm::vec3(90.0f));
    mvp = projection * view * model;

    light = glm::vec3(0.0f, 1.0f, 1.0f);

    std::vector<tinyobj::shape_t> shapes;
    std::vector<tinyobj::material_t> materials;

    std::string err; 
    if (!tinyobj::LoadObj(shapes, materials, err, "res/GOLDFISH.obj")) {
        throw std::runtime_error(std::string("Error loading OBJ file:\n") + err);
    }

    std::cout << "Shapes: " << shapes.size() << std::endl
              << "Materials: " << materials.size() << std::endl
              << "Positions: " << shapes[0].mesh.positions.size() << std::endl
              << "Normals: " << shapes[0].mesh.normals.size() << std::endl
              << "TexCoords: " << shapes[0].mesh.texcoords.size() << std::endl;

    shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);

    int width, height, numComponents;
    unsigned char * imageData = stbi_load("res/GOLDFISH.bmp",
                                    &width, &height, &numComponents, 4);

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
                imageData);
    glBindTexture(GL_TEXTURE_2D, NULL);

    stbi_image_free(imageData);

    GLsizei vertex_buffer_size = 0;
    for (int i = 0 ; i < shapes.size(); ++i) {
        vertex_buffer_size += sizeof(float) * shapes[i].mesh.positions.size();
    }
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, NULL, GL_STATIC_DRAW);
        for (int i = 0, offset = 0 ; i < shapes.size() ; ++i) {
            glBufferSubData(GL_ARRAY_BUFFER, offset, 
                    sizeof(float) * shapes[i].mesh.positions.size(), 
                    &shapes[i].mesh.positions[0]);

            offset += sizeof(float) * shapes[i].mesh.positions.size();
        }
    glBindBuffer(GL_ARRAY_BUFFER, NULL);

    GLsizei index_buffer_size = 0;
    GLsizei index_size = 0;
    for (int i = 0 ; i < shapes.size() ; ++i) {
        index_buffer_size += sizeof(float) * shapes[i].mesh.indices.size();
        index_size += shapes[i].mesh.indices.size();
    }
    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_buffer_size, NULL, GL_STATIC_DRAW);
        for (int i = 0, offset = 0 ; i < shapes.size() ; ++i) {
            glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset,
                    sizeof(unsigned int) * shapes[i].mesh.indices.size(),
                    &shapes[i].mesh.indices[0]);

            offset += sizeof(unsigned int) * shapes[i].mesh.indices.size();
        }
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL);

    GLsizei texcoord_buffer_size = 0;
    for (int i = 0 ; i < shapes.size() ; ++i) {
        texcoord_buffer_size += sizeof(float) * shapes[i].mesh.texcoords.size();
    }
    glGenBuffers(1, &tbo);
    glBindBuffer(GL_ARRAY_BUFFER, tbo);
        glBufferData(GL_ARRAY_BUFFER, texcoord_buffer_size, NULL, GL_STATIC_DRAW);

        for (int i = 0, offset = 0 ; i < shapes.size() ; ++i) {
            glBufferSubData(GL_ARRAY_BUFFER, offset,
                    sizeof(float) * shapes[i].mesh.texcoords.size(),
                    &shapes[i].mesh.texcoords[0]);
            offset += sizeof(float) * shapes[i].mesh.texcoords.size();
        }
    glBindBuffer(GL_ARRAY_BUFFER, NULL);

    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
            glEnableVertexAttribArray(0);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
        glBindBuffer(GL_ARRAY_BUFFER, tbo);
            glEnableVertexAttribArray(1);
            glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
    glBindVertexArray(NULL);

    glBindBuffer(GL_ARRAY_BUFFER, NULL);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL);

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

        cYAngle += 0.1f;

        matrices(cXAngle, cYAngle);

        glUseProgram(shaderProgram);
            std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mV") << std::endl;
            std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mM") << std::endl;
            std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mvp") << std::endl;
            glUniformMatrix4fv(
                    glGetUniformLocation(shaderProgram, "mvp"), 
                    1, GL_FALSE, &mvp[0][0]);

            glUniformMatrix4fv(
                    glGetUniformLocation(shaderProgram, "mV"), 
                    1, GL_FALSE, &view[0][0]);
            glUniformMatrix4fv(
                    glGetUniformLocation(shaderProgram, "mM"), 
                    1, GL_FALSE, &model[0][0]);

            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, texture);
            glUniform1i(glGetUniformLocation(shaderProgram, "textureSampler"), 0);

            glBindVertexArray(vao);
                glDrawElements(GL_TRIANGLES, index_buffer_size, GL_UNSIGNED_INT, NULL);
            glBindVertexArray(NULL);
        glUseProgram(NULL);

        glfwPollEvents();
        glfwSwapBuffers(window);
    }

    glfwTerminate();

    return 0;
}

void matrices(GLfloat xAngle, GLfloat yAngle) {
    model = glm::mat4(1.0f);
    model = glm::rotate(model, glm::radians(xAngle), glm::vec3(+1.0f, +0.0f, +0.0f));
    model = glm::rotate(model, glm::radians(yAngle), glm::vec3(+0.0f, +1.0f, +0.0f));
    model = glm::scale(model, glm::vec3(40.0f));

    mvp = projection * view * model;
}
并更改了以下行

glUseProgram(shaderProgram);
    std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mP") << std::endl;
    std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mV") << std::endl;
    std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mM") << std::endl;

    glUniformMatrix4fv(
        glGetUniformLocation(shaderProgram, "mP"), 
        1, GL_FALSE, &projection[0][0]);
    glUniformMatrix4fv(
        glGetUniformLocation(shaderProgram, "mV"), 
        1, GL_FALSE, &view[0][0]);
    glUniformMatrix4fv(
        glGetUniformLocation(shaderProgram, "mM"), 
        1, GL_FALSE, &model[0][0]);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(glGetUniformLocation(shaderProgram, "textureSampler"), 0);
    glBindVertexArray(vao);
        glDrawElements(GL_TRIANGLES, index_buffer_size, GL_UNSIGNED_INT, NULL);
    glBindVertexArray(NULL);
glUseProgram(NULL);
glUseProgram(shaderProgram);

std::cout
mM
mV
未在顶点着色器代码中使用。我相信它会在编译过程中被删除,因此当您尝试使用
glGetUniformLocation()
获取它们的位置时,此信息不可用。尝试在着色器代码中使用
mM
mV

嘿!谢谢你的回答。我也尝试过这个,比如,我去掉了
mvp
uniform,将3个矩阵发送到着色器并在那里进行乘法,但仍然不起作用,
glGetUniformLocation
为每个uniform返回-1。
glUseProgram(shaderProgram);
    std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mP") << std::endl;
    std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mV") << std::endl;
    std::cout << "Location -> " << glGetUniformLocation(shaderProgram, "mM") << std::endl;

    glUniformMatrix4fv(
        glGetUniformLocation(shaderProgram, "mP"), 
        1, GL_FALSE, &projection[0][0]);
    glUniformMatrix4fv(
        glGetUniformLocation(shaderProgram, "mV"), 
        1, GL_FALSE, &view[0][0]);
    glUniformMatrix4fv(
        glGetUniformLocation(shaderProgram, "mM"), 
        1, GL_FALSE, &model[0][0]);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    glUniform1i(glGetUniformLocation(shaderProgram, "textureSampler"), 0);
    glBindVertexArray(vao);
        glDrawElements(GL_TRIANGLES, index_buffer_size, GL_UNSIGNED_INT, NULL);
    glBindVertexArray(NULL);
glUseProgram(NULL);