2010-06-25 44 views
7

Tôi cố gắng để sử dụng hướng dẫn này http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45Làm thế nào để có được VBO làm việc

tôi tải nó trong visual studio của tôi năm 2008, biên dịch nó, và nó nói tập tin mất tích: "GLES/glplatform.h" vì vậy tôi google file ... sau đó nó whines thiếu tập tin: "KHR/khrplatform.h", vì vậy tôi google mà quá ... sau đó nó rên rỉ tất cả mọi thứ có thể, "GLDouble undeclared định danh" vv vv, mặc dù hướng dẫn đó có #include mà nên có những .

Tôi không biết bắt đầu sửa lỗi ở đâu, có thể ai đó chỉ cho tôi cách sử dụng VBO đúng cách (vẽ hình khối vv), mọi mã tôi đã thử chỉ bị treo hoặc không biên dịch. tôi không thể tìm thấy bất cứ thứ gì hoạt động.

+0

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

+0

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

Trả lời

13

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); 
+0

TUYỆT VỜI, cuối cùng là một số tiến bộ! Có vẻ như vụ tai nạn là do không gọi glewInit(). OMG tôi đã nhận nó làm việc, đây thực sự là VBO? tôi bắt đầu nghi ngờ nó vì nó hoạt động! : D cảm ơn! – Newbie

+0

hạnh phúc cho bạn rằng nó hoạt động Tôi cũng đã khó khăn thời gian với VBO: D nếu bạn đang học OpenGL có thể giải pháp tốt hơn sẽ được RedBook sau đó NeHe, bởi vì nó được cập nhật rất thường xuyên. Chỉ có điều xấu trên cuốn sách đó tôi nghĩ rằng các ví dụ phức tạp hơn thì họ nên được nhưng bạn đã có tất cả mọi thứ .. thực sự;) – Raven

+0

bạn có muốn giúp tôi để có được mảng màu sắc làm việc? tôi có thể bắt đầu câu hỏi mới nếu bạn thích. – Newbie

Các vấn đề liên quan