2016-04-18 40 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, которое требуется для основного профиля.

Смежные вопросы