OpenGL忽略四边形并使它们成为三角形

Aet*_*her 2 c++ opengl glsl

这是我第二次制作游戏引擎,但我现在有点卡住,因为我无法弄清楚为什么会发生这种情况,无论我发送什么对象,OpenGL只会在中心绘制一个白色三角形.屏幕,像这样.

我甚至在Renderer和Camera Objects上的最后一个引擎中修改了我的旧代码,但仍然是相同的,所以我猜它与渲染脚本有关.

渲染:

Renderer2D::Renderer2D(const Shader& shader) {
    this->shader = shader;
    this->Init();
}

Renderer2D::~Renderer2D() {
    glDeleteVertexArrays(1, &this->QuadVAO);
}

void Renderer2D::Render(Texture & texture, iVec2 position, iVec2 size, float rotation, iVec3 color) {
    this->shader.Use();
    iMat4 model;

    using namespace glm;
    model = translate(model, iVec3(position.x, position.y, 0.0f));
    /*
    model = translate(model, iVec3(size.x * 0.5f, size.y * 0.5f, 0.0f));
    model = rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));
    model = translate(model, iVec3(size.x * -0.5f, size.y * -0.5f, 0.0f));
    */
    model = glm::scale(model, iVec3(size.x, size.y, 1.0f));

    this->shader.SetMatrix4("model2D", model);
    this->shader.SetVector3f("color2D", color);

    glActiveTexture(GL_TEXTURE0);
    texture.Bind();

    glBindVertexArray(this->QuadVAO);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glBindVertexArray(0);
}

void Renderer2D::Init() {
    U16 VBO;

    float vertices[] = {
        // Pos      // Tex
        0.0f, 1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 0.0f, 0.0f,

        0.0f, 1.0f, 0.0f, 1.0f,
        1.0f, 1.0f, 1.0f, 1.0f,
        1.0f, 0.0f, 1.0f, 0.0f
    };

    glGenVertexArrays(1, &this->QuadVAO);
    glGenBuffers(1, &VBO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glBindVertexArray(this->QuadVAO);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}
Run Code Online (Sandbox Code Playgroud)

顶点着色器:

#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 position, vec2 texCoords>

out vec2 TexCoords;

uniform mat4 view2D;
uniform mat4 model2D;
uniform mat4 projection2D;

void main()
{
    TexCoords = vertex.zw;
    gl_Position = projection2D * view2D * mode2Dl * vec4(vertex.xy, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

顶点着色器:

#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 position, vec2 texCoords>

out vec2 TexCoords;

uniform mat4 view2D;
uniform mat4 model2D;
uniform mat4 projection2D;

void main()
{
    TexCoords = vertex.zw;
    gl_Position = projection2D * view2D * model2D * vec4(vertex.xy, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#version 330 core
in vec2 TexCoords;
out vec4 color2D; //Fixed the error!

uniform sampler2D image2D;
uniform vec3 color2D;

void main()
{    
    color2D = vec4(color2D, 1.0) * texture(image2D, TexCoords);
}  
Run Code Online (Sandbox Code Playgroud)

Resources.cpp

Shader Resources::LoadShaderFromFile(const char * vertexSource, const char * fragmentSource) {
    using namespace std;
    string vertexCode;
    string fragmentCode;

    try {
        ifstream vertexShaderFile(vertexSource);
        ifstream fragmentShaderFile(fragmentSource);
        stringstream vShaderStream, fShaderStream;

        vShaderStream << vertexShaderFile.rdbuf();
        fShaderStream << fragmentShaderFile.rdbuf();

        vertexShaderFile.close();
        fragmentShaderFile.close();

        vertexCode = vShaderStream.str();
        fragmentCode = fShaderStream.str();
    }
    catch (exception e) {
        cout << "ERROR::SHADER: Failed to read shader files" << std::endl;
    }

    const char *vShaderCode = vertexCode.c_str();
    const char *fShaderCode = fragmentCode.c_str();

    Shader shader;
    shader.Compile(vShaderCode, fShaderCode);

    return shader;
}
Run Code Online (Sandbox Code Playgroud)

Rab*_*d76 5

你的着色器甚至没有编译.当您声明矩阵制服时,则使用名称model2D,view2D并且projection2D:

uniform mat4 view2D;
uniform mat4 model2D;
uniform mat4 projection2D;
Run Code Online (Sandbox Code Playgroud)

但是当你使用矩阵时,你使用名称view,modelprojection:

gl_Position = projection * view * model * vec4(vertex.xy, 0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)

我建议检查着色器对象是否已成功编译以及程序对象是否成功链接.

如果可以通过glGetShaderiv和参数检查着色器的编译成功GL_COMPILE_STATUS.

例如

GLuint shaderObj = .... ;
glCompileShader( shaderObj );

GLint status = GL_TRUE;
glGetShaderiv( shaderObj, GL_COMPILE_STATUS, &status );
if ( status == GL_FALSE )
{
    GLint logLen;
    glGetShaderiv( shaderObj, GL_INFO_LOG_LENGTH, &logLen );
    std::vector< char >log( logLen );
    GLsizei written;
    glGetShaderInfoLog( shaderObj, logLen, &written, log.data() );
    std::cout << "compile error:" << std::endl << log.data() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果程序的链接成功,则可以通过glGetProgramiv参数进行检查GL_LINK_STATUS.

例如

GLuint progObj = ....;
glLinkProgram( progObj );

GLint status = GL_TRUE;
glGetProgramiv( progObj, GL_LINK_STATUS, &status );
if ( status == GL_FALSE )
{
    GLint logLen;
    glGetProgramiv( progObj, GL_INFO_LOG_LENGTH, &logLen );
    std::vector< char >log( logLen );
    GLsizei written;
    glGetProgramInfoLog( progObj, logLen, &written, log.data() );
    std::cout  << "link error:" << std::endl << log.data() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)