OpenGL简单网格没有显示

时间:2014-07-23 17:17:53

标签: opengl 3d shader mesh glew

过去两天我一直在关注(非常精彩且内容丰富的)教程系列:http://www.youtube.com/playlist?list=PLEETnX-uPtBXT9T-hD0Bj31DSnwio-ywh

昨晚我完成了关于网格的部分,现在我的窗口上应该出现一个红色三角形,但它并没有。我不知道我的网格或我的着色器类是否有问题(对于他们两个我都没有得到任何错误)。我使用GLEW 1.10.0加载OpenGL,使用GLM 0.9.5.4加载OpenGL数学内容,使用SDL 2.0.3加载窗口内容。在Visual Studio 2013 Ultimate中使用最新的Nvidia图形驱动程序在Windows 8.1上运行。

编辑:我忘了提到屏幕不会保持黑色,所以display.Clear方法有效。我希望有任何帮助。

以下是我的着色器和网格文件:


Shader.h:

#pragma once

#include <iostream>
#include <fstream>
#include <string>
#include <glew\glew.h>

using namespace std;

class Shader
{

public:

    Shader(const string& fileName);
    virtual ~Shader();

    void Bind();

private:

    string LoadShader(const string& fileName);
    void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const string& errorMessage);
    GLuint CreateShader(const string& text, GLenum shaderType);

    static const unsigned int NUM_SHADERS = 2;
    GLuint m_program;
    GLuint m_shaders[NUM_SHADERS];

};


Shader.cpp

#include "Shader.h"

Shader::Shader(const string& fileName)
{
    m_program = glCreateProgram();

    m_shaders[0] = CreateShader(LoadShader(fileName + ".vert"), GL_VERTEX_SHADER);
    m_shaders[1] = CreateShader(LoadShader(fileName + ".frag"), GL_FRAGMENT_SHADER);

    for (unsigned int i = 0; i < NUM_SHADERS; i++)
        glAttachShader(m_program, m_shaders[i]);

    glLinkProgram(m_program);
    CheckShaderError(m_program, GL_LINK_STATUS, true, "Error: Program linking failed");

    glValidateProgram(m_program);
    CheckShaderError(m_program, GL_VALIDATE_STATUS, true, "Error: Program is invalid");
}

Shader::~Shader()
{
    for (unsigned int i = 0; i < NUM_SHADERS; i++)
    {
        glDetachShader(m_program, m_shaders[i]);
        glDeleteShader(m_shaders[i]);
    }

    glDeleteProgram(m_program);
}

string Shader::LoadShader(const string& fileName)
{
    ifstream file;
    file.open(fileName.c_str());

    string line;
    string output;

    if (file.is_open())
    {
        while (file.good())
        {
            getline(file, line);
            output += (line + "\n");
        }
    }
    else
    {
        cerr << "Unable to load shader: " << fileName << endl;
    }

    return output;
}

GLuint Shader::CreateShader(const string& text, GLenum shaderType)
{
    GLuint shader = glCreateShader(shaderType);

    if (shader == 0)
        cerr << "Error: Shader creation failed!";

    const GLchar* shaderSourceStrings[1] = { text.c_str() };
    GLint shaderSourceStringLengths[1] = { text.length() };

    glShaderSource(shader, 1, shaderSourceStrings, shaderSourceStringLengths);
    glCompileShader(shader);

    CheckShaderError(shader, GL_COMPILE_STATUS, false, "Error: Shader compilation failed");

    return shader;
}

void Shader::Bind()
{
    glUseProgram(m_program);
}

void Shader::CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const string& errorMessage)
{
    GLint success = 0;
    GLchar error[1024] = { 0 };

    if (isProgram)
        glGetProgramiv(shader, flag, &success);
    else
        glGetShaderiv(shader, flag, &success);

    if (success == GL_FALSE)
    {
        if (isProgram)
            glGetProgramInfoLog(shader, sizeof(error), NULL, error);
        else
            glGetShaderInfoLog(shader, sizeof(error), NULL, error);

        cerr << errorMessage << ": '" << error << "'" << endl;
    }
}


BasicShader.vert:

#version 420 core

attribute vec3 position;

void main()
{
    gl_Position = vec4(position, 1.0);
}


BasicShader.frag:

#version 420 core

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


Mesh.h:

#pragma once

#include <glew\glew.h>
#include "Vertex.h"

class Mesh
{

public:

    Mesh(Vertex* vertecies, unsigned int numVertecies);
    virtual ~Mesh();

    void Draw();

private:

    enum
    {
        POSITION_VB,
        NUM_BUFFERS
    };

    GLuint m_vertexArrayObject;
    GLuint m_vertexArrayBuffers[NUM_BUFFERS];
    unsigned int m_drawCount;
};


Mesh.cpp:

#include "Mesh.h"

Mesh::Mesh(Vertex* vertecies, unsigned int numVertecies)
{
    m_drawCount = numVertecies;

    glGenVertexArrays(1, &m_vertexArrayObject);
    glBindVertexArray(m_vertexArrayObject);

    glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertecies[0]) * numVertecies, vertecies, GL_STATIC_DRAW);

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

    glBindVertexArray(0);
}

Mesh::~Mesh()
{
    glDeleteBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
    glDeleteVertexArrays(1, &m_vertexArrayObject);
}

void Mesh::Draw()
{
    glBindVertexArray(m_vertexArrayObject);

    glDrawArrays(GL_TRIANGLES, 0, m_drawCount);

    glBindVertexArray(0);
}


Vertex.h:

#pragma once

#include <glm\glm.hpp>

using namespace glm;

class Vertex
{

public:

    Vertex(const vec3& pos);
    virtual ~Vertex();

private:

    vec3 m_pos;

};


Vertex.cpp:

#include "Vertex.h"

Vertex::Vertex(const vec3& pos)
{
    m_pos = pos;
}

Vertex::~Vertex()
{
}


main.cpp中:

#include "Display.h"
#include "Shader.h"
#include "Mesh.h"

using namespace std;

int main(int argc, char** argv)
{
    Display display(800, 600, "Hello World");

    Vertex vertecies[] =
    {
        Vertex(vec3(-0.5, -0.5, 0)),
        Vertex(vec3(0, 0.5, 0)),
        Vertex(vec3(0.5, -0.5, 0))
    };

    Mesh mesh(vertecies, sizeof(vertecies) / sizeof(vertecies[0]));
    Shader shader(".\\res\\BasicShader");

    while (!display.IsClosed())
    {
        display.Clear(0.0f, 0.15f, 0.3f, 1.0f);

        shader.Bind();
        mesh.Draw();

        display.Update();
    }

    return 0;
}


我非常感谢任何帮助...

1 个答案:

答案 0 :(得分:1)

尝试将您的顶点程序更改为:

#version 420 core

layout(location = 0) in vec3 position;

void main()
{
    gl_Position = vec4(position, 1.0);
}

和您的片段程序:

#version 420 core

out vec4 frag;

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