2013-05-11 28 views
5

पर दो बनावट भेजना मेरे जीएलएसएल शेडर को दो बनावट भेजते समय केवल एक ही आता है। अजीब बात यह है कि मेरे पहले बांधने वाले बनावट का उपयोग मेरे शेडर में दोनों बनावट स्लॉट के लिए किया जाता है। यह मुझे विश्वास दिलाता है कि जिस तरह से मैं ओपनजीएल में अपने बनावट गुजर रहा हूं वह गलत है। हालांकि, मैं समस्या को ट्रैक करने में असमर्थ हूं।जीएलएसएल शेडर

यहां वह कोड है जहां मैं अपने शेडर में उपयोग के लिए बनावट को कॉन्फ़िगर करता हूं।

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo2); 
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); 
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


// Get uniforms 
GLuint pass_3O = glGetUniformLocation(blend_shader, "org"); 
GLuint pass_3B = glGetUniformLocation(blend_shader, "blur"); 

// Activate shaders 
glUseProgram(blend_shader); 


// Bind first texture 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, init_texture); 

// Bind the second texture 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, third_texture); 

// Assign index to 2d images 
glUniform1i(pass_3O, 0); 
glUniform1f(pass_3B, 1); 

उपरोक्त कोड दो बनावट में गुज़र रहा है। पहला 3 डी दृश्य के पहले प्रतिपादन पास की 2 डी छवि है। तीसरा यह है कि धुंध के x2 स्तरों के साथ एक ही बनावट जोड़ा गया। यह अंतिम चरण एक गरीब मनुष्य खिलने के लिए उन्हें एक साथ मिश्रण करना है।

यहां वह कोड है जहां मैं दोनों बनावट को चौकोर में खींच रहा हूं।

// Draw to quad 
glBegin(GL_QUADS); 
    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 0.0f); 
    glVertex3f(-w_width/2.0, -w_height/2.0, 0.5f); 

    glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0f, 1.0f); 
    glVertex3f(-w_width/2.0, w_height/2.0, 0.5f); 

    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 1.0f); 
    glVertex3f(w_width/2.0, w_height/2.0, 0.5f); 

    glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f); 
    glMultiTexCoord2f(GL_TEXTURE1, 1.0f, 0.0f); 
    glVertex3f(w_width/2.0, -w_height/2.0, 0.5f); 
glEnd(); 
glFlush(); 
glPopAttrib(); 

// Unbind textures 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, 0); 

// Disable blend shader 
glUseProgram(0); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0); 

और यहां वह शेडर है जिसका उपयोग मैं अंतिम छवि प्रस्तुत करने के लिए कर रहा हूं।

Vert

#version 120 
void main() 
{ 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_TexCoord[1] = gl_MultiTexCoord1; 
    gl_Position = ftransform(); 
} 

Frag

#version 120 
uniform sampler2D org; 
uniform sampler2D blur; 
void main() 
{ 
    vec4 orig_clr = texture2D(org, gl_TexCoord[0].st); 
    vec4 blur_clr = texture2D(blur, gl_TexCoord[1].st); 
    //gl_FragColor = orig_clr; 
    gl_FragColor = blur_clr; 
} 

अगर मैं टुकड़ा शेडर में अंतिम दो पंक्तियों के बीच स्विच मैं एक ही सटीक परिणाम प्राप्त। कौन सा बनावट प्रस्तुत करने का एकमात्र तरीका है उस क्रम को बदलना जिसमें मैं उन्हें बांधता हूं।

उदाहरण के लिए, अंततः मुझे धुंधली छवि पास कर देगी। एक बार फिर, केवल दो छवियों में से एक प्राप्त करना।

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, third_texture); 


glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, init_texture); 

जो कुछ मैं देख रहा हूं उस पर कोई विचार? इस कोड में

उत्तर

6

देखो:

glUniform1i(pass_3O, 0); 
glUniform1f(pass_3B, 1); 

तुम यहाँ कुछ छोटे टाइपो है, यह होना चाहिए glUniform1 * मैं दूसरी कॉल में Uniform1 * च * के बजाय *। प्रकार शेडर वैरिएबल से मेल खाना चाहिए, इसलिए इस कॉल को केवल कुछ त्रुटि होनी चाहिए, जिससे वर्दी 0 पर शुरू हो गई है, जो आपके परिणामों को पूरी तरह से समझाती है।

+0

आपको बहुत बहुत धन्यवाद! यह आश्चर्यजनक है कि इस तरह के सिरदर्द का कारण इतना छोटा हो सकता है। – Freddy

+4

वैकल्पिक रूप से, आप पहले बनावट के लिए नए लेआउट (बाध्यकारी = 0) का उपयोग कर सकते हैं, और दूसरे के लिए लेआउट (बाइंडिंग = 1) का उपयोग कर सकते हैं, तो आपको वर्दी सेट करने की आवश्यकता नहीं है। बेशक, आपको इसके लिए OpenGL4.2 की आवश्यकता है ... – fluffels

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