簡體   English   中英

OpenGL代碼不會顯示任何內容

[英]OpenGL code won't show anything

所以,我正在學習OpenGL並遵循一個教程。 我唯一不同的是,我將不同文件中的代碼分開,以使其更有條理。

事情是,當我嘗試運行它不會顯示一個東西,甚至背景顏色(我用glClearColor(1.0,1.0,1.0,1.0)設置的將不會改變。

在codeBlocks下運行,Linux Mint Rebecca。

main.cpp中:

#include <iostream>
using namespace std;

#include <GL/glew.h>
#include <GL/freeglut.h>
//Comment/uncomment to change objects
//#define OBJ1 1                /*/*/
//#define OBJ2 1                /*/*/
//#define OBJ3 1                /*/*/
//Keep it clean                 /*/*/
#include "general.h"            /*/*/
#include "shaderManip.h"        /*/*/
#include "shape.h"              /*/*/
/*---------------------------------*/
// Comodity
#define BUFFER_OFFSET(i) ((char *)NULL + (i))

void renderScene(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(1.0, 1.0, 1.0, 1.0);

    glDrawArrays(GL_TRIANGLES, 0, 3);
    glutSwapBuffers();
}

int main(int argc, char** argv){
    // Initialize GLUT
    glutInit(&argc, argv);
    // Setup memory buffer for display
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA);
    // Create window
    glutInitWindowSize(700, 700);
    glutCreateWindow("Main View");
    // Window manip stuff
    glutReshapeFunc(changeViewport);
    glutDisplayFunc(renderScene);
    // Magic
    glewInit();
    // Picking Shaders
    const char* vertexShaderSource = readFile("vertexShader.glsl");
    const char* fragmentShaderSource = readFile("fragmentShader.glsl");
    GLuint vertShaderID = makeVertexShader(vertexShaderSource);
    GLuint fragShaderID = makeFragmentShader(fragmentShaderSource);
    shaderProgramID = makeShaderProgram(vertShaderID, fragShaderID);
    // Unlimited Buffer Works
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);

    glBufferData(GL_ARRAY_BUFFER, (dimEachVertex + dimEachColor)*numVertices*sizeof(GLfloat), NULL, GL_STATIC_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, dimEachVertex*numVertices*sizeof(GLfloat), vertices);
    glBufferSubData(GL_ARRAY_BUFFER, dimEachVertex*numVertices*sizeof(GLfloat), numColors*dimEachColor*sizeof(GLfloat), colors);

    positionID  = glGetAttribLocation(shaderProgramID, "s_vPosition");
    colorID     = glGetAttribLocation(shaderProgramID, "s_vColor");

    glVertexAttribPointer(positionID, dimEachVertex, GL_FLOAT, GL_FALSE, 0, 0);
    glVertexAttribPointer(colorID, dimEachColor, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertices*dimEachVertex*sizeof(GLfloat)));
    glUseProgram(shaderProgramID);
    glEnableVertexAttribArray(positionID);
    glEnableVertexAttribArray(colorID);
    // Main loop
    glutSpecialFunc(specialKeyboard);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}

general.h中:

#ifndef GENERAL_H
#define GENERAL_H
/*
    Utilities library.
    Just for organization's sake on the main file.
*/
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
using namespace std;

//Define as shader program
extern GLuint shaderProgramID;
//Vertex Array Object
extern GLuint vao;
//Vertex Buffer Object
extern GLuint vbo;
//Get s_vPosition and s_vColor from shader
extern GLuint positionID, colorID;

void changeViewport(int w, int h);
void keyboard(unsigned char key, int x, int y);
void specialKeyboard(int key, int x, int y);


#endif // GENERAL_H

general.cpp:

#include "general.h"

//Define as shader program
GLuint shaderProgramID;
//Vertex Array Object
GLuint vao = 0;
//Vertex Buffer Object
GLuint vbo;
//Get s_vPosition and s_vColor from shader
GLuint positionID, colorID;

void changeViewport(int w, int h){
    glViewport(0, 0, w, h);
}

void keyboard(unsigned char key, int x, int y){
    if(key == 27)   //Terminate
        exit(0);
}

void specialKeyboard(int key, int x, int y){
    if(key == GLUT_KEY_RIGHT){      //Arrow Right
        cout << "Key_RIGHT\n";
    }
    if(key == GLUT_KEY_LEFT){       //Arrow Left
        cout << "Key_LEFT\n";
    }
    if(key == GLUT_KEY_UP){         //Arrow Up
        cout << "Key_UP\n";
    }
    if(key == GLUT_KEY_DOWN){       //Arrow Down
        cout << "Key_DOWN\n";
    }
    if(key == GLUT_KEY_PAGE_UP){    //Page Up
        cout << "Key_PG_UP\n";
    }
    if(key == GLUT_KEY_PAGE_DOWN){   //Page Down
        cout << "Key_PG_DOWN\n";
    }
}

shape.h

#ifndef SHAPE
#define SHAPE

#include <GL/glew.h>
#include <GL/freeglut.h>

#define triangle_Shape 1
//#define square_Shape 1

#ifdef triangle_Shape

extern int dimEachVertex;
extern int dimEachColor;

extern int numVertices;
extern int numColors;

extern GLfloat vertices[];

extern GLfloat colors[];

#endif // triangle_Shape

#endif // SHAPE

shape.cpp

#include "shape.h"

#define triangle_Shape 1
//#define cube_Shape 1

#ifdef triangle_Shape

int dimEachVertex = 3;
int dimEachColor  = 4;

int numVertices = 3;
int numColors   = 3;

GLfloat vertices[] = {
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    0.0f, 0.5f, 0.0f
};

GLfloat colors[] = {
    1.0f, 0.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f
};

#endif // triangle_Shape

“shaderManip.h”和“.cpp”文件只是從教程中復制而來,所以我沒有費心去附上。

我非常感謝你能提供的任何幫助。

我的着色器錯了。 我一定在復制教程時輸錯了。 顯示的代碼唯一不對的是glClearColor函數,它應該在renderScene函數的glClear之前,如Colonel Thirty Two所指出的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM