2011-02-11 8 views
6

जीएलएसएल 1.50, ओपनजीएल 3.3।ट्रांसफॉर्म फीडबैक (ओपनजीएल) का पूरा सेटअप

मैं हाल ही में अपनी ट्रैनफॉर्म प्रतिक्रिया प्राप्त करने की कोशिश कर रहा हूं लेकिन सफलता के बिना। मुझे अभी भी glBeginTranformFeedback() के बाद त्रुटि प्राप्त हुई है और जैसा कि मुझे कोई पूर्ण कार्य कोड नहीं मिला है, मैंने अपने ज्ञान को कुछ कोड के साथ ढंका है जो मुझे मिला और दस्तावेज़ीकरण है, अब तक यह अच्छी तरह से काम कर रहा है लेकिन मुझे कुछ याद आ रहा है। तो अगर किसी को पूरा कोड मिला (बफर शुरू करना, सेट करना, अपडेट करना, प्रतिपादन करना, वापस पढ़ना) यह निश्चित रूप से मदद करेगा और यदि आपको पता नहीं है कि आप क्या कर रहे हैं तो आप मेरे कोड को देख सकते हैं। मैं कुछ बेंच मार्किंग बाहर रखा गया, खिड़कियों के रख-रखाव और यह रचना है:

int main() 
{ 
    bool fullsize = false, paused = false; 
    std::string caption = "Tester"; 

    GLuint dataVAO,speedUpdateVBO,dataVBO; 
    std::vector<vector3f> dataW; 

    // Create the main rendering window 

    init(); //just some camera commands 

    UniShader shader; //my shader class keeps everything together 
    shader.init(); 
    shader.addShader("test.vert"); 
    shader.addShader("test.frag"); 
    shader.newAttributeVariable("speed"); 
    shader.newFeedbackVarying("sp"); 
    shader.linkShader(); 
    shader.use(); 

    //init some data 
    dataW.push_back(vector3f(0,1,0)); 

    //creating VAO 
    glGenVertexArrays(1,&dataVAO); 
    glBindVertexArray(dataVAO); 
    //creating VBO 
    glGenBuffers(1,&dataVBO); 
    glBindBuffer(GL_ARRAY_BUFFER,dataVBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f), 0, GL_DYNAMIC_DRAW); 
    glVertexAttribPointer(shader.getAttributeIndex("speed"), 3, GL_FLOAT, GL_FALSE, 0, 0); 

    glGenBuffers(1, &speedUpdateVBO); 
    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO); 
    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f), NULL, GL_DYNAMIC_COPY); 
    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO); 
    glBindVertexArray(0); 


    while (App.IsOpened()) 
    { 
      App.SetActive(); 
     benchP = Clock.GetElapsedTime(); 

     //update calls 
     if(!paused) 
      //update 
     benchU = Clock.GetElapsedTime(); 

     //render calls 
     glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glColor3f(0.6f,0.7f,0.7f); 

    GLuint query; 
    GLuint count = 0; 

    glGenQueries(1, &query); 

    glEnableVertexAttribArray(shader.getAttributeIndex("speed")); 

    glBindVertexArray(dataVAO); 

    glBindBuffer(GL_ARRAY_BUFFER,dataVBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f)*dataW.size(), &dataW[0], GL_DYNAMIC_DRAW); 
    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO); 
    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f)*dataW.size(), NULL, GL_DYNAMIC_COPY); 

    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO); 
    glEnable(GL_RASTERIZER_DISCARD); 
    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query); 
    printOglError(); //Until this everything OK, I think 
    glBeginTransformFeedback(GL_POINTS); 
    printOglError(); //This one prints out Invalid Value 

    glDrawArrays(GL_POINTS,0,dataW.size()); 

    glEndTransformFeedback(); 
    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); 
    glDisable(GL_RASTERIZER_DISCARD); 

    //retrieve updated data 
    glGetQueryObjectuiv(query, GL_QUERY_RESULT, &count); //count is 0 -> nothing happend 

    glBindVertexArray(0); 
    glDisableVertexAttribArray(shader.getAttributeIndex("speed")); 

    glDeleteQueries(1, &query); 

    App.Display(); 
    //some other benchmark stuff 
} 

shaders: Vert

#version 150 core 
in vec3 speed; 

varying vec3 sp; 

const float gravity_constant = 9.81f; 

void main(){ 
    sp = speed; 
    sp += vec3(0,-gravity_constant,0); 
} 

frag

#version 150 core 
varying vec3 sp; 

void main (void) 
{ 
    vec3 c = sp; 
    gl_FragColor = vec4(c,1.0); 
} 

टुकड़ा शेडर है सिर्फ GLSL optimalization के लिए। यदि एसपी का उपयोग नहीं किया जाएगा तो जीएलएसएल इसे साफ़ कर देगा। कुछ मामूली बग हो सकते हैं क्योंकि मैंने इसे बहुत बड़े कोड से निकाला है जो कई अलग-अलग असफलताओं के साथ भी विफल रहता है।

+0

क्या आप शेडर क्लास कार्यान्वयन पोस्ट कर सकते हैं? साथ ही, हमें बताएं कि आप किस प्लेटफ़ॉर्म पर चल रहे हैं और ड्राइवर संस्करण क्या है। – kvark

+0

क्या मैं आपको प्रयोग को दोहराने के लिए कह सकता हूं, लेकिन कार्यक्रम से जुड़ा कोई टुकड़ा शेडर नहीं (केवल कशेरुका एक)? जीएलएसएल कंपाइलर द्वारा अनुकूलित 'एसपी' मान के बारे में चिंता न करें - यह नहीं होगा (मेरे पास किसी भी एफपी घटकों के बिना टीएफ शेडर्स हैं)। – kvark

+0

खैर मुझे लगता है कि मैं वास्तव में उस बिंदु से इसे ले सकता हूं क्योंकि नमूना पैक ने इसे सबकुछ सरल और आसान बना दिया है। लेकिन मैं किसी की मदद करने से ज्यादा नहीं पूछ सकता, इसलिए शेडर क्लास संपादन में होगा, मैं विंडोज 7 पर चल रहा हूं, अति राडेन 3870 एचडी। उत्प्रेरक नियंत्रण केंद्र 10.6 ओपनजीएल संस्करण 6.14.10.9901 (3.3 के आसपास कुछ) के साथ। "शून्य मुख्य() {}" को साफ़ करने वाले टुकड़े को साफ़ करना एक ही त्रुटि देता है। लोडिंग से शेडर को छोड़कर एक ही त्रुटि मिलती है .. – Raven

उत्तर

4

OpenGL Samples Pack पर एक नज़र डालें। आपको ogl-330-transform-feedback.cpp और ogl-400-transform-feedback-object.cpp में रुचि हो सकती है। आप January 2011 OpenGL drivers status को भी देख सकते हैं कि नवीनतम ड्राइवरों को प्रदान किए गए उदाहरणों के साथ कोई समस्या है या नहीं।

शुभकामनाएं।

+0

ऐसा लगता है कि इन नमूने अंततः मुझे अंधेरे से मार्गदर्शन कर सकते हैं: डी हां वे सिर्फ वही हैं जो मुझे चाहिए। मेरे ऐप को थोड़ा सा पुनर्निर्माण करने की आवश्यकता होगी, हालांकि मुझे आशा है कि यह आखिरकार काम करेगा। मैंने देखा कि वे वर्टेक्सएरे और फीडबैक बफर के रूप में एक ही बफर ऑब्जेक्ट को बाध्य कर रहे हैं .. और उस बिंदु से उन्हें पॉइंटर्स निर्दिष्ट करना होगा .. यह होना चाहिए – Raven

0

आप राक्षस 3 डी की जाँच करने के लिए चाहते हो सकता है: http://www.ogre3d.org/forums/viewtopic.php?p=299736

वे प्रतिक्रिया को बदलने की एक काम कार्यान्वयन है लगता है।

+1

उहम ढेर में सुई खोजना होगा, लेकिन जब तक कोई बेहतर कुछ पोस्ट नहीं करेगा, मैं इसे चलाने की कोशिश करूंगा। मुझे लगता है कि मुझे पता है कि कहां से शुरू करना है, लेकिन ओग्रे बड़ा इंजन है और अन्य कोड में कुछ प्रारंभिक छिपाए जा सकते हैं। हालांकि तेज जवाब के लिए धन्यवाद! :) – Raven

+0

ठीक है इसमें खोद गया और कुछ मिला। मैंने कॉल के ऑर्डर को बदल दिया लेकिन यह अभी भी glEndTransformFeedback पर glBeginTranformFeedback पर त्रुटि देता है। इसके अलावा पहला अंतर यह है कि वे अपने बड़े इंटरफेस का उपयोग कर रहे हैं कि वे अभी भी एनवी एक्सटेंशन का उपयोग कर रहे हैं, लेकिन मैं एटीआई पर चल रहा हूं और वे इंटरलीव किए गए सरणी का उपयोग कर रहे हैं लेकिन मुझे अलग चाहिए। यह वैसे भी उन त्रुटि को नहीं लिखना चाहिए ताकि कुछ गलत हो। – Raven

1

डैनियल राकोस के पास स्रोत कोड के साथ एक डेमो है, ओपनजीएल पर ट्रांसफॉर्म फीडबैक का उपयोग करके इंस्टेंसिंग को लागू करना। यह इस पर गौर करने के लिए मदद कर सकता है:

http://rastergrid.com/blog/2010/02/instance-culling-using-geometry-shaders/

+0

1. अच्छा प्रोग्राम, अब मुझे पता है कि मेरी समस्या ड्राइवर/कार्ड से संबंधित नहीं है और वहाँ एक स्रोत कोड भी है .. महम स्वादिष्ट .. 2. (केवल जानकारी के लिए) वह 6-7 फ्रेम पर चल रहा था, मुझे 70-210 पर .. lol और यह सिर्फ एक श्रृंखला अंतर है: डी – Raven

0

मैं भी एक ऐसी ही समस्या का सामना करना है कि glBeginTransformFeedback उत्पन्न "अवैध आपरेशन"। बाद मैं फ़ाइल में स्रोत कोड को पढ़ने के लिए "जीएल-440-परिणत-feedback.cpp" ORHUN द्वारा प्रदान पैकेज से, मैंने पाया कि जोड़ने

glEnable(GL_RASTERIZER_DISCARD); 

से पहले glBeginTransformFeedback() कॉल सिर्फ समस्या का हल।

उम्मीद है कि इससे मदद मिल सकती है।

+0

मुझे नहीं करना था मेरे समाधान में इसका उपयोग करें, लेकिन मुझे खुशी है कि इससे मदद मिली। यदि आप देखना चाहते हैं, तो यह मेरे शेडर्स लाइब्रेरी का हिस्सा है: https://github.com/BetaRavener/UniShader/blob/master/src/UniShader/ShaderOutput.cpp। ध्यान दें कि यह ओपनजीएल 3.3 के खिलाफ विकसित किया गया था – Raven

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