我試圖讓一個超級簡單的GLFW和VBO的例子運行,但我卡住了。對於其他項目,我使用了glBegin
和glEnd
,但我試圖更新我的代碼以使用OpenGL ES 2,但現在我只想盡可能地向前兼容。與簡單的VBO例子的麻煩
從網上一些例子,我想出了下面的代碼:
#include <stdlib.h>
#include <GL/glfw3.h>
#include <stdio.h>
#define bool int
#define true 1
#define false 0
const int width = 800;
const int height = 600;
bool opened = true;
GLuint glTriangle;
GLfloat triangle[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};
void init() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glGenBuffers(1, &glTriangle);
glBindBuffer(GL_ARRAY_BUFFER, glTriangle);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
}
void display() {
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, glTriangle);
glVertexAttribPointer(0L, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
}
int windowClose(GLFWwindow window) {
opened = false;
return GL_TRUE;
}
void main() {
if (!glfwInit()) {
printf("glfwInit didn't work\n");
return;
}
GLFWwindow window = glfwCreateWindow(width, height, GLFW_WINDOWED, "Test", 0);
glfwMakeContextCurrent(window);
init();
glfwSetWindowCloseCallback(window, windowClose);
glfwSwapInterval(1);
while(opened) {
display();
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
}
此代碼運行,但我得到的是一個黑色的屏幕時,我希望看到一個白色的三角形。我試圖避免像shaders /紋理那樣的任何幻想,直到我至少在屏幕上畫東西。
如果有問題,我正在編譯:Linux上的gcc -o test -lGL -lglfw -lm test.c
,通過Mesa驅動程序與OpenGL版本2.1。
我在做什麼錯?如果我需要指定顏色信息,那麼簡單的方法是什麼?
不推薦使用「glEnableClientState」和「glVertexPointer」嗎?這就是爲什麼我用另外兩個。 – tjameson
@tjameson:不;他們被*刪除*,不被棄用。其餘的固定功能流水線也是如此。如果您想要依賴非核心3.1+ OpenGL功能,您*需要*着色器進行渲染。 –
我想這是給出問題的最佳答案。我決定找出着色器(實際上並不太難),現在它正在工作。感謝@NicolBolas,這正是我所期待的。 – tjameson