2016-04-18 63 views
-2

我想渲染一个螺旋,因为所有的红色使用着色器来覆盖颜色。出于某种原因,他们编译和链接,但什么都不做。为什么这些GLSL着色器不工作?

请看下面的代码

fragmentshader.glsl

#version 430 

out vec4 outColor; 
in vec4 color; 

void main(){ 
    outColor = color; 
} 

vertexshader.glsl

#version 430 

in layout(location=0) vec2 position; 
out vec4 color; 

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

Window.cpp

#include <GL\glew.h> 
#include <glm\glm.hpp> 
#include <glm\gtc\matrix_transform.hpp> 
#include "MeGLWindow.h" 

#include <iostream> 
#include <fstream> 

#define Pi 3.14159265358979 
#define E 2.718281828F 
#define SCREEN_WIDTH 800 
#define SCREEN_HEIGHT 600 
#define MAX_SPIRAL 25000 

std::string readFile(const char* relPath); 
void installShaders(); 
bool checkShaderStatus(GLuint shaderID); 
bool checkProgramStatus(GLuint programID); 

GLuint programID; 

void MeGLWindow::initializeGL() { 
    glewInit(); 
    glEnable(GL_DEPTH_TEST); 

    installShaders(); 

    const int verts_num = MAX_SPIRAL * 2; 
    GLfloat verts[50000]; 
    GLuint myBufferID; 
    float a = 0.06f; 
    float b = 0.06f;  

    float cx = 0.0; 
    float cy = 0.0; 
    int z = 0; 
    for (int i = 0; i < MAX_SPIRAL; i++) { 
     float ang = (Pi/720) * i; 
     float factor = pow(E, b * ang); 
     float x = cx + (a * (cos(ang)) * factor); 
     float y = cy - (a * (sin(ang)) * factor); 
     verts[2 * i] = x; 
     verts[(2 * i) + 1] = y; 
    } 
    glGenBuffers(1, &myBufferID); 
    glBindBuffer(GL_ARRAY_BUFFER, myBufferID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); 
} 

void MeGLWindow::paintGL() { 
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 
    glViewport(0, 0, width(), height()); 

    glDrawArrays(GL_POINTS, 0, 2*25000); 
} 

void installShaders() { 
    GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); 
    GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); 
    const char* adapter[1]; 

    std::string file = readFile("vertexshader.glsl"); 
    const char* vertexFile = file.c_str(); 
    adapter[0] = vertexFile; 
    glShaderSource(vertexShaderID, 1, adapter, 0); 

    file = readFile("fragmentshader.glsl"); 
    const char* fragmentFile = file.c_str(); 
    adapter[0] = fragmentFile; 
    glShaderSource(fragmentShaderID, 1, adapter, 0); 

    glCompileShader(vertexShaderID); 
    glCompileShader(fragmentShaderID); 

    if (!checkShaderStatus(vertexShaderID) ||     !checkShaderStatus(fragmentShaderID)) { 
     return; 
    } 
    programID = glCreateProgram(); 
    glAttachShader(programID, vertexShaderID); 
    glAttachShader(programID, fragmentShaderID); 

    glLinkProgram(programID); 
    if (!checkProgramStatus(programID)) {  
     return; 
    } 


    glUseProgram(programID); 
} 

的main.cpp

#include <Qt\qapplication.h> 
#include "MeGLWindow.h" 

int main(int argc, char* argv[]) { 
    QApplication app(argc, argv); 
    MeGLWindow meWindow; 
    meWindow.show(); 
    return app.exec(); 
} 

根据链接的着色器,螺旋中的顶点应该是红色的!我究竟做错了什么?请帮忙!

+0

快速浏览一下就可以了:你应该在链接后检查程序状态,编译和附加着色器可能工作正常,链接仍然可能失败。 –

+0

我把checkProgramStatus(programID)放在glLinkProgram(programID)后面,看起来好像现在可以工作! – user1546060

+0

这应该不会解决它......它做得很好。 – RecursiveExceptionException

回答

1
  • 对着色器程序没有错误检查。或者说,您检查错误,但不要以任何方式指示程序创建失败的应用程序。

  • 你不为checkProgramStatus提供源,但如果你GL_LINK_STATUS检查,你这样做,你链接的问题之前

  • 目前还不清楚你如何从提供的代码初始化OpenGL,但你没有设置VAO,这是核心配置文件所必需的。