【问题标题】:OpenGL Programming Guide First exampleOpenGL 编程指南 第一个例子
【发布时间】:2013-12-21 16:13:01
【问题描述】:

我正在关注第 8 版,以下是我从书中修改的代码。它没有给我我想要的东西,而是一个空白窗口。我想知道我在修改过程中犯了什么错误?

以下是我修改的代码,希望大家指出错误。

#include <iostream>
#include <OpenGL/glu.h>
#include <OpenGL/gl3.h>
#include <GLUT/GLUT.h>

GLuint vaoNames[1];
GLuint bufferNames[1];
int vPosition = 0;

GLuint createProgram();
GLuint createShader(GLenum type, const char* src);
GLuint program;

void init()
{
    glGenVertexArrays(1, vaoNames);
    glBindVertexArray(vaoNames[0]);

    GLfloat  vertices[6][2] = {
        { -0.90, -0.90 },  // Triangle 1
        {  0.85, -0.90 },
        { -0.90,  0.85 },
        {  0.90, -0.85 },  // Triangle 2
        {  0.90,  0.90 },
        { -0.85,  0.90 }
    };

    glGenBuffers(1, bufferNames);
    glBindBuffer(GL_ARRAY_BUFFER, bufferNames[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glUseProgram(createProgram());
    glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(vPosition);
}

void render()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vaoNames[0]);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glFlush();
}

GLuint createProgram()
{
    GLuint program = glCreateProgram();

    const char* vertexShaderSrc =
    "#version 400 core                              \n"
    "layout( location = 0 ) in vec4 vPosition;      \n"
    "void main()                                    \n"
    "{                                              \n"
        "gl_Position = vPosition;                   \n"
    "}";
    GLuint vertexShader = createShader(GL_VERTEX_SHADER, vertexShaderSrc);

    const char* fragmentShaderSrc =
    "#version 400 core                              \n"
    "out vec4 fColor;                               \n"
    "void main()                                    \n"
    "{                                              \n"
    "fColor = vec4( 0.0, 0.0, 1.0, 1.0 );           \n"
    "}";
    GLuint fragmentShader = createShader(GL_FRAGMENT_SHADER, fragmentShaderSrc);

    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);

    glLinkProgram(program);
    return program;
}

GLuint createShader(GLenum type, const char* src){
    GLuint shaderID = glCreateShader(type);
    glShaderSource(shaderID, 1, &src, 0);
    glCompileShader(shaderID);
    return shaderID;
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutCreateWindow("8877");

    init();
    glutDisplayFunc(render);
    glutMainLoop();
}

【问题讨论】:

  • 你想在 OSX 上做一些傻事吗?
  • 除了空白屏幕之外,您是否遇到任何错误?你能张贴你得到的和你期望的屏幕截图吗(如果可以的话)?
  • 为什么不检查着色器编译和链接日志?
  • @genpfault 在着色器编译和程序链接期间没有错误。我只是一个初学者,这是你好世界的例子。谢谢
  • @rhughes,没有任何错误,我得到的只是一个黑色的空白窗口,根据教程 >,我期待一个带有两个三角形的场景示例。

标签: opengl


【解决方案1】:

当你说'在着色器编译和程序链接期间没有错误'时,你的意思是程序没有停止,还是你的意思是你实际上运行了一个不同的程序并检查了glGetError()的结果在各个点,或获取编译或链接日志?你的程序没有实际的错误检查,当然 OpenGL 也不会抛出异常或产生错误输出。你必须实际要求这些东西。

仅仅因为glCompileShader() 不产生错误并不意味着您的着色器实际已编译。您需要检查着色器的编译状态和程序的链接状态,代码类似于:

    GLint compiled;
    glGetShaderiv(newShader, GL_COMPILE_STATUS, &compiled);
    if (!compiled) {
        std::string log = getLog(newShader);
        SAY(log.c_str());
        throw std::runtime_error("Failed to compile shader " + log);
    }

getLog 在哪里

static std::string getLog(GLuint shader) {
    std::string log;
    GLint infoLen = 0;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);

    if (infoLen > 1) {
        char* infoLog = new char[infoLen];
        glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
        log = std::string(infoLog);
        delete[] infoLog;
    }
    return log;
}

这是用于检查着色器,并且有用于检查结果和获取程序链接的日志的等效功能。除非您调用它们,否则您无法保证着色器正在编译。假设您没有在着色器语法中犯过一些简单的错误,那么您面临的最可能的问题是缺乏对 OpenGL 4.x 的支持,这会导致着色器立即失败。

【讨论】:

  • 感谢@Jherico,问题似乎是Mac os x 支持较低版本的Opengl 导致着色器无法编译。
  • 我应该猜到了。 #include 语句是 Mac OS 独有的,我自己一直在为 OSX 缺乏 4.x 支持而苦苦挣扎。
  • 我也是,根据这个链接developer.apple.com/graphicsimaging/opengl/capabilities/…,我的代码应该支持GLSL 4.1。不知何故,它似​​乎不是。我仍在努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多