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