ok vì vậy hãy bắt đầu với những gì bạn nên kiểm tra. Trong trình biên dịch của bạn tìm gl.h. Nếu bạn không tìm thấy nó tải về Windows SDK. Nếu bạn đang sử dụng Visual Studio tốt cho bạn, nếu không chỉ lấy các tập tin OpenGL. Tôi đề nghị bạn đầy đủ SDK vì tôi chưa tìm thấy gl.h separatelly, có lẽ bởi vì mọi người đều có nó .. Đối với SDK, trong Windows Server 2003 R2 Platform SDK các tệp OpenGL này là chắc chắn, nhưng bạn nên thử trước Windows 7/Vista SDK.
Hiện tại. Bạn đã đề cập đến GLES. Tôi không biết GLES hoạt động như thế nào vì tôi sử dụng GLEW. Trong nhiều cách NeHe đã viết hướng dẫn tuyệt vời nhưng họ đang nhận được lỗi thời. Vì vậy, nếu bạn muốn tiếp tục với tôi, hãy sử dụng GLEW. Bạn sẽ bao gồm nó khi bắt đầu + bạn sẽ phải cung cấp thư viện. Giống như này
#include <GL/glew.h>
#pragma comment(lib,"glew32.lib")
Ngoài ra, bạn sẽ phải sao chép glew32.dll vào thư mục EXE của bạn.
Bây giờ bạn sẽ được thiết lập để tạo VBO. Tôi đoán rằng bạn đã học cách tạo cửa sổ trống nếu không here's link. Bạn sẽ phải tải xuống GLUT (hoặc thẻ miễn phí tốt hơn) nếu bạn chưa có, nhưng nó được sử dụng rộng rãi và bạn sẽ cần nó sau này.
Chúng tôi sẽ thực hiện một số bổ sung trong mã đó. Trong func chính, gọi init() dưới CreateWindow gọi như thế này
glutCreateWindow ("You’re first OpenGL Window");
init();
và làm cho hàm init trông như thế này:
void init(){
glewInit();
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glShadeModel(GL_FLAT);
glEnableClientState(GL_VERTEX_ARRAY);
}
cũng làm cho Reshape() Func:
void reshape(int w, int h){
glViewport(0,0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}
và thêm dòng này dưới glutDisplayFunc (display);
glutReshapeFunc(reshape);
Bây giờ chúng tôi đã sẵn sàng cho VBO thực sự đây là việc tạo cửa sổ nhỏ, nơi chúng tôi có thể thấy đầu ra nhưng như bạn đã nói có một số vấn đề tôi viết nó tốt hơn.
Vậy làm thế nào để sử dụng VBO nếu bạn muốn xem kết quả tại đây là code tôi sẽ cố gắng để cho bạn biết về nó: làm toàn cầu biến
GLuint ID;
trước khi bất kỳ chức năng
thêm phần này trên dưới cùng của init() chức năng:
float data[][2] = {{50,50},{100,50},{75,100}};
glGenBuffers(1,&ID);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
và phần này vào chức năng hiển thị đó là sản phẩm nào trong thời điểm này:
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,0.0f,0.0f);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);
glDrawArrays(GL_POLYGON,0,3);
glFlush();
Bạn sẽ thấy hình tam giác màu đen. Vì vậy, để mã. Bạn thực hiện một số loại dữ liệu. Sau đó, bạn tạo ID VBO mới không được sử dụng (sẽ là 1 trong ví dụ của chúng tôi mọi lúc :)). Sau này với Bind gọi bạn thực sự tạo ra VBO này và với BufferData gọi bạn asign dữ liệu của bạn để VBO đó. Trong hiển thị, bạn rõ ràng cửa sổ để sử dụng, chọn màu vẽ và bây giờ Bind có nghĩa là kích hoạt đối tượng đệm này. Bạn có thể có số lượng VBO trong ARRAY_BUFFER nhưng chỉ có một người có thể hoạt động. VertexPointer được sử dụng để thiết lập sự khởi đầu của VBO và các bước tiến giữa các phần tử của nó. Như bạn có thể thấy chúng ta đã sử dụng các tọa độ X và Y như các phần tử, vì vậy, stride là 2 * sizeof (float). Đó là bởi vì stride là theo byte. Finnaly DrawArrays là gọi lại, một cái gì đó như bạn sẽ gọi glBegin() và glEnd(). Bạn nói những gì để vẽ, và trong đó phạm vi. glFlush() chỉ được sử dụng để hiển thị nội dung được hiển thị.
Nếu bạn bị lạc đâu đó trong mã ở đây nó là trên một nơi:
#include <windows.h>
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>
#pragma comment(lib,"glew32.lib")
GLuint ID;
void init(){
glewInit();
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glShadeModel(GL_FLAT);
glEnableClientState(GL_VERTEX_ARRAY);
float data[][2] = {{50,50},{100,50},{75,100}};
glGenBuffers(1,&ID);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
}
void reshape(int w, int h){
glViewport(0,0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,0.0f,0.0f);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);
glDrawArrays(GL_TRIANGLES,0,3);
glFlush();
}
int main(int argc, char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(300,300);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
PS: Tôi biết đây là tháng câu hỏi cũ nhưng tôi nghĩ rằng tất cả những câu hỏi cần được trả lời để bất cứ ai tìm kiếm cùng một vấn đề thắng' t nhận được ở đây và tìm thấy không có gì;)
PSS: Nếu ví dụ này yêu cầu DLL bạn có chúng trong freeglut hoặc GLEW file bin;)
Edit1: tôi quên cho rằng vì vậy đừng làm cho cùng một sai lầm, sau khi bạn đã kết thúc với VBO phá hủy nó để ngăn chặn rò rỉ bộ nhớ. Vì VRAM không quá lớn nên điều này có thể nghiêm trọng dưới đây là cách thực hiện:
glDeleteBuffers(1, &ID);
Vị trí trong [lưu trữ này] (http://nehe.gamedev.net/data/lessons/vc/lesson45.zip) là glplatform.h #included? Nếu bất cứ điều gì nó nên được phàn nàn về một glaux.h mất tích, đó là rất, * rất * không được chấp nhận. – genpfault
YEah, bạn có thể cho tôi ví dụ hoạt động và không được chấp nhận không? tất cả tôi có thể tìm thấy là crap cũ ... – Newbie