2016-04-28 31 views
1

我正在通過一個book on OpenGL工作,我被卡在第三章。下面的代碼應該打開一個窗口並在中心繪製一個點。OpenGL和GLFW - 我需要着色器來繪製一個點嗎?

窗口出現,glClearColorglClear似乎工作,但沒有點。 This answer我認爲我可能需要編譯和鏈接簡單的頂點和片段着色器。

這本書沒有提到它們,但是我需要着色器嗎?我是如何繪製點的?窗戶上有什麼東西?該書使用了一些WIN32事情的窗口,我使用Linux Mint的低於17.1

代碼:

#include <stdlib.h> 
#include <stdio.h> 

#include <GL/glew.h> 
#include <GL/gl.h> 
#include <GLFW/glfw3.h> 
#include <GL/glut.h> 

#define BUFFER_OFFSET(i) ((char*)NULL + (i)) 

static void error_callback(int error, const char* description) { 
    fputs(description, stderr); 
} 

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { 
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) 
    glfwSetWindowShouldClose(window, GL_TRUE); 
} 

int main(void) { 
    GLFWwindow* window; 
    glfwSetErrorCallback(error_callback); 
    if (!glfwInit()) { 
    exit(EXIT_FAILURE); 
    } 

    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); 
    if (!window) { 
    glfwTerminate(); 
    exit(EXIT_FAILURE); 
    } 
    glfwMakeContextCurrent(window); 
    glfwSwapInterval(1); 
    glfwSetKeyCallback(window, key_callback); 

    if (glewInit()) { 
    glfwTerminate(); 
    exit(EXIT_FAILURE); 
    } 

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 

    float ratio; 
    int width, height; 
    glfwGetFramebufferSize(window, &width, &height); 
    ratio = width/(float) height; 
    glViewport(0, 0, width, height); 

    GLfloat vertex [] = {0.0f, 0.0f, -2.0f}; 
    GLuint m_vertexBuffer; 
    glGenBuffers(1, &m_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3, &vertex[0], GL_STATIC_DRAW); 

    while (!glfwWindowShouldClose(window)) { 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
    glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0)); 
    glPointSize(10.0f); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glDrawArrays(GL_POINTS, 0, 1); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    glfwSwapBuffers(window); 
    glfwPollEvents(); 
    } 

    glfwDestroyWindow(window); 
    glfwTerminate(); 
    exit(EXIT_SUCCESS); 
} 

此外,我與g++ main.cpp -lGL -lglfw -lGLU -lGLEW

編譯我已經安裝了的OpenGL 4.5,但我打開固定管道上下文。

+0

不,你不需要着色器,除非你使用OpenGL 3或4(你知道,因爲你必須要求),在這種情況下,一切都需要着色器。 – immibis

+0

(在OpenGL 3中,他們使着色器成爲強制性的,這使得它們可以刪除大量非着色器的東西,大大簡化了OpenGL,但也使其難以開始) – immibis

+0

啊哈,謝謝!我已經安裝了4.5,而這本書顯然是使用版本2.第六章是'可編程管道',它以3+開頭。 – Will

回答

2

從代碼:

GLfloat vertex [] = {0.0f, 0.0f, -2.0f}; 

由於您使用固定功能pipelione,從來沒有設置任何的矩陣,無論是投影和模型視圖矩陣將在默認左,點(0,0, -2)在觀看音量之外。嘗試(0,0,0)。

如果本書使用這個代碼與這個頂點座標恰好相反,那麼最好搜索另一個。您還應該考慮學習「現代」GL。固定功能流水線基本上已被十年前的GL2.0 中的着色器所取代。

+0

我試過了,仍然沒有點。無論如何,謝謝,但是我要通讀數學的章節,然後只需要擔心現代GL畫點。 GLSL FTW。 – Will