2010-06-25 20 views
7

मैं इस ट्यूटोरियल http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45कैसे VBO काम कर पाने के लिए

उपयोग करने के लिए मैं अपने विजुअल स्टूडियो 2008 में लोड यह संकलन, और यह फ़ाइल गुम कहते हैं की कोशिश की: "GLES/glplatform.h" तो मैं फ़ाइल गूगल ... तो यह फ़ाइल गायब हो जाता है: "केएचआर/khrplatform.h", तो मैं भी उस पर गूगल ... तो यह सब कुछ संभव है, "जीएलडी डबल undeclared पहचानकर्ता" आदि, भले ही उस ट्यूटोरियल में # शामिल है जो उन लोगों को होना चाहिए ।

मुझे नहीं पता कि यह कहां से ठीक करना है, क्या कोई मुझे कोड दे सकता है कि वीबीओ का सही तरीके से उपयोग कैसे करें (एक घन आदि खींचें), हर कोड मैंने केवल क्रैश की कोशिश की है या संकलित नहीं किया है। मैं काम करता है कि कुछ भी नहीं मिल सकता है।

+0

में कहाँ [इस संग्रह] (http://nehe.gamedev.net/data/lessons/vc/lesson45.zip) glplatform.h # शामिल है? अगर कुछ भी गायब glaux.h के बारे में शिकायत करनी चाहिए, जो बहुत है, * बहुत * बहिष्कृत। – genpfault

+0

YEah, क्या आप मुझे उदाहरण दे सकते हैं जो काम करता है और बहिष्कृत नहीं किया जाता है? सब मुझे मिल सकता है पुराना बकवास है ... – Newbie

उत्तर

13

ठीक है तो चलो शुरू करें कि आपको किस चीज की जांच करनी चाहिए। अपने कंपाइलर में gl.h के लिए देखो। यदि आपको यह Windows SDK डाउनलोड नहीं मिलेगा। यदि आप विजुअल स्टूडियो का उपयोग अपने लिए अच्छा कर रहे हैं, तो ओपनजीएल फाइलें न लें। मैं आपको पूर्ण एसडीके का सुझाव देता हूं क्योंकि मुझे अभी तक gl.h अलग नहीं मिला है, शायद इसलिए कि सभी के पास यह है .. एसडीके के लिए, विंडोज सर्वर 2003 आर 2 प्लेटफार्म एसडीके में इन ओपनजीएल फाइलें निश्चित हैं, लेकिन आपको पहले विंडोज 7 की कोशिश करनी चाहिए/विस्टा एसडीके।

अब। आपने जीएलएस का उल्लेख किया है। मुझे नहीं पता कि जीएलएस कैसे काम करता है क्योंकि मैं जीएलईडब्ल्यू का उपयोग करता हूं। कई तरीकों से नेहे ने महान ट्यूटोरियल लिखे लेकिन वे पुराने हो रहे हैं। तो यदि आप मेरे साथ जारी रखना चाहते हैं, तो GLEW का उपयोग करें। आप इसे शुरू में शामिल करेंगे + आपको पुस्तकालय प्रदान करना होगा। इस

#include <GL/glew.h> 
#pragma comment(lib,"glew32.lib") 

इसके अलावा आपको glew32.dll को उस फ़ोल्डर में कॉपी करना होगा जहां आपका EXE है।

अब आपको वीबीओ बनाने के लिए सेट अप किया जाना चाहिए। मुझे लगता है कि अगर आपने here's link नहीं तो रिक्त विंडो बनाने के लिए पहले से ही सीखा है। यदि आप पहले से नहीं थे, तो आपको GLUT (या बेहतर फ्रीग्लूट) डाउनलोड करना होगा, लेकिन इसका व्यापक रूप से उपयोग किया जाता है और आपको बाद में इसकी आवश्यकता होगी।

हम उस कोड में कुछ जोड़ देंगे। मुख्य समारोह में, init() CreateWindow के तहत फोन इस

glutCreateWindow ("You’re first OpenGL Window"); 
init(); 

की तरह कॉल और समारोह बनाने init इस तरह दिखेगा:

void init(){ 
    glewInit(); 
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 
    glShadeModel(GL_FLAT); 
    glEnableClientState(GL_VERTEX_ARRAY); 
} 

भी आकृति बदलें() समारोह बनाने:

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); 
} 

और glutDisplayFunc (डिस्प्ले) के तहत इस लाइन को जोड़ें;

glutReshapeFunc(reshape); 

अब हम VBO के लिए तैयार कर रहे हैं वास्तव में इस विंडो जहाँ हम उत्पादन देख सकते हैं की सिर्फ तुच्छ बनाने था, लेकिन जैसा कि आप ने कहा कि आप कुछ समस्याओं मैं बेहतर यह नीचे लिखा है, दूसरों के लिए के रूप में किया था।

तो VBO उपयोग करने के लिए कैसे यदि आप परिणाम देखना चाहते हैं अब यहाँ मैं इसके बारे में आपको बताने के लिए कोशिश करता हूँ कोड है: वैश्विक चर

GLuint ID; 

बनाने के कार्यों

की

इस हिस्से को जोड़ने के किसी भी करने से पहले

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

और प्रदर्शन समारोह में इस हिस्से जो इस पल में खाली है::

init() फ़ंक्शन के तल पर
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(); 

आपको काले त्रिकोण देखना चाहिए। तो कोड के लिए। आप कुछ प्रकार का डेटा बनाते हैं। फिर आप नई वीबीओ आईडी उत्पन्न करते हैं जो उपयोग में नहीं है (हर बार हमारे उदाहरण में 1 होगा :))। इसके बाद बाइंड कॉल के साथ आप वास्तव में इस वीबीओ को बनाते हैं और बफरडाटा कॉल के साथ आप उस वीबीओ पर अपना डेटा एगिन करते हैं। डिस्प्ले में, आप उपयोग के लिए विंडो साफ़ करते हैं, रंग ड्राइंग का चयन करें और अब बाइंड का अर्थ है इस बफर ऑब्जेक्ट को सक्रिय करें। आपके पास ARRAY_BUFFER में VBO की संख्या हो सकती है लेकिन केवल एक सक्रिय हो सकता है। VertexPointer का उपयोग वीबीओ की शुरुआत और इसके तत्वों के बीच की ओर बढ़ने के लिए किया जाता है। जैसा कि आप देख सकते हैं कि हमने X और Y निर्देशांक का उपयोग तत्वों के रूप में किया है, इसलिए 2 * आकार (फ्लोट) है। ऐसा इसलिए है क्योंकि घुमाव बाइट्स में है। Finnaly DrawArrays कॉल प्रस्तुत करता है, कुछ ऐसा है जिसे आप glBegin() और glEnd() कहते हैं। आप बताते हैं कि क्या आकर्षित करना है, और किस सीमा में। glFlush() का उपयोग केवल प्रस्तुत सामग्री दिखाने के लिए किया जाता है।

#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; 
} 

पुनश्च::

आप यहीं कहीं कोड में कहीं गुम हो गया है, तो यह एक ही स्थान पर चल रहा है मैं जानता हूँ कि इस महीने के पुराने सवाल है, लेकिन मुझे लगता है कि सभी सवालों का जवाब दिया जाना चाहिए ताकि किसी को भी एक ही समस्या की तलाश में जीता ' टी यहाँ मिलता है और कुछ भी नहीं पाते;)

पीएसएस: इस उदाहरण DLL के लिए पूछता है कि आप उन्हें freeglut या Glew बिन फाइलों में है;)

Edit1: मैं उस के लिए भूल गया तो वही गलती नहीं बनाते हैं के बाद, आप स्मृति रिसाव को रोकने के लिए इसे नष्ट कर VBO के साथ समाप्त कर रहे हैं। VRAM इतना बड़ा नहीं है जैसा कि इस गंभीर हो सकता है यह इस प्रकार करना है:

glDeleteBuffers(1, &ID); 
+0

ग्रेट, अंत में कुछ प्रगति! ऐसा लगता है कि दुर्घटना glewInit() को कॉल न करने के कारण हुई थी। ओएमजी मुझे यह काम मिल गया, क्या यह वास्तव में वीबीओ है? मैं इसे काम करने के बाद से संदेह करना शुरू कर देता हूँ! : डी धन्यवाद! – Newbie

+0

आपके लिए खुश है कि यह काम करता है मुझे वीबीओ के साथ भी मुश्किल समय था: डी अगर आप ओपनजीएल सीख रहे हैं तो बेहतर समाधान रेडबुक तब नेहे होगा, क्योंकि यह बहुत बार अपडेट होता है। उस पुस्तक पर केवल बुरी चीज मुझे लगता है कि उदाहरण अधिक जटिल हैं तो उन्हें होना चाहिए लेकिन आपको वहां सबकुछ मिल गया .. वास्तव में;) – Raven

+0

क्या आप रंगीन सरणी पाने के लिए मेरी मदद करना चाहते हैं? यदि आप चाहें तो मैं नया प्रश्न शुरू कर सकता हूं। – Newbie

संबंधित मुद्दे