2012-09-03 23 views
9

जब दोनों बनावट एक ही आयताकार को कवर करते हैं तो मैं टुकड़े टुकड़े में विभिन्न मिश्रण मोड के साथ दो बनावट मिश्रण कर सकता हूं। लेकिन अब मेरी समस्या यह है कि एक बनावट एक सादा आयताकार है जिसमें कोई घूर्णन नहीं होता है और दूसरा बनावट घूर्णन/स्केल और अनुवाद के साथ एक और आयताकार होता है। मैं इन बनावट को जिस तरीके से चाहता हूं उसे कैसे विलय करूं? में बनावट सम्मिश्रण के लिए (तस्वीर में)मैं आईफोन पर ओपनजीएल ईएस 2.0 में विभिन्न समन्वय के साथ दो बनावट कैसे मिश्रित करूं?

मैं जानता हूँ कि यह कैसे करना है ...

enter image description here

लेकिन ऐसा करने के तरीके के लिए सुनिश्चित ...

enter image description here

एक आयताकार (पहली छवि), मैंने निम्नलिखित कोड का उपयोग किया ..

उद्देश्य सी कोड ...

- (void) display { 
    [EAGLContext setCurrentContext:context]; 

    glBindFramebuffer(GL_FRAMEBUFFER, targetFBO); 

    glUseProgram(program); 

    glActiveTexture(GL_TEXTURE2); 
    glBindTexture(GL_TEXTURE_2D, textureTop); 

    glActiveTexture(GL_TEXTURE3); 
    glBindTexture(GL_TEXTURE_2D, textureBot); 

    glUniform1i(inputTextureTop, 2); 
    glUniform1i(inputTextureBot, 3); 

    glUniform1f(alphaTop, alpha); 

    glEnable (GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    glVertexAttribPointer(position, 2, GL_FLOAT, 0, 0, imageVertices); 
    glVertexAttribPointer(inputTextureCoordinate, 2, GL_FLOAT, 0, 0, textureCoordinates); 

    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER]; 
} 

वर्टेक्स शेडर ...

attribute vec4 position; 
attribute vec4 inputTextureCoordinate; 

varying vec2 textureCoordinate; 

void main() 
{ 
    gl_Position = position; 
    textureCoordinate = inputTextureCoordinate.xy; 
} 

टुकड़ा शेडर ...

varying highp vec2 textureCoordinate; 

uniform sampler2D inputTextureTop; 
uniform sampler2D inputTextureBot; 

uniform highp float alphaTop; 

void main() 
{ 
    lowp vec4 pixelTop = texture2D(inputTextureTop, textureCoordinate); 
    lowp vec4 pixelBot = texture2D(inputTextureBot, textureCoordinate); 

    gl_FragColor = someBlendOperation(pixelTop, pixelBot); 
} 
+0

हो सकता है कि मैं शीर्ष पिक्सेल के XY प्राप्त करने के लिए खंड शेडर में कुछ ज्यामितीय ऑपरेशन कर सकता हूं। – abix

+3

हाय मुझे एक ही समस्या है, @ मैक्स समाधान पृष्ठभूमि छवि की तुलना में एक अलग आकार और घूर्णन पर शीर्ष छवि को आकर्षित करने की आवश्यकता से निपटने के लिए सीम नहीं करता है, आप इसे कैसे प्रबंधित करते हैं? – Eyal

उत्तर

7

आप 2 बनावट

attribute vec4 position; 
attribute vec4 inputTextureCoordinate; 
attribute vec4 inputTextureCoordinate2; 

varying vec2 textureCoordinate; 
varying vec2 textureCoordinate2; 

void main() 
{ 
    gl_Position = position; 
    textureCoordinate = inputTextureCoordinate.xy; 
    textureCoordinate2 = inputTextureCoordinate2.xy; 
} 

Frag छायांकर्ता

varying highp vec2 textureCoordinate; 
varying highp vec2 textureCoordinate2; 

uniform sampler2D inputTextureTop; 
uniform sampler2D inputTextureBot; 

uniform highp float alphaTop; 

void main() 
{ 
    lowp vec4 pixelTop = texture2D(inputTextureTop, textureCoordinate); 
    lowp vec4 pixelBot = texture2D(inputTextureBot, textureCoordinate2); 

    gl_FragColor = someBlendOperation(pixelTop, pixelBot); 
} 

बी शेडर और संशोधित करने के लिए शेडर ObjectiveC में जोड़े

glVertexAttribPointer(inputTextureCoordinate2, 2, GL_FLOAT, 0, 0, textureCoordinates2); 

शीर्ष shader निर्देशांक पास करना TW inputTextureCoordinate vec4 होने के लिए आवश्यक नहीं है लेकिन यह vec2

+0

धन्यवाद मैक्स! एक जादू की तरह काम किया! – abix

+0

@ मैक्स, मेरे पास एक समान प्रश्न है, क्या आप कृपया इसके साथ मेरी मदद कर सकते हैं। धन्यवाद। –

+2

क्या आपने इसे कहीं पोस्ट किया है? – Max

4

आप एक ही आदिम पर दो बनावट सम्मिश्रण रहे हैं, तो आप में रंग मिश्रण कर सकते हैं शेडर

हालांकि यदि आप दो अलग-अलग प्राइमेटिव्स को मिश्रित करना चाहते हैं, तो आप वास्तव में केवल हार्डवेयर मिश्रण (GL_BLEND) का उपयोग करना चाहते हैं।

नीचे की तस्वीर खींचें, फिर मिश्रण को सक्षम करें और शीर्ष चित्र खींचें। शीर्ष चित्र का अल्फा मान नियंत्रित करता है कि यह कितना पारदर्शी होगा।

आप वास्तव में एक ही ड्रॉ कॉल में दोनों क्वाड खींचने की कोशिश नहीं करना चाहते हैं, क्योंकि वे समान निर्देशांक का उपयोग नहीं करते हैं।

+1

हाँ, मैं यह कर सकता हूं। लेकिन GL_BLEND का उपयोग करके मैं केवल मिश्रण संख्याओं की एक निश्चित संख्या कर सकता हूं। जो मैं वास्तव में करना चाहता हूं वह स्वयं मिश्रण मिश्रण को परिभाषित करता है (जैसे फ़ोटोशॉप मिश्रण मोड ... गुणा, ओवरले, स्क्रीन इत्यादि)। मैं सोच रहा था कि क्या मैं texture2D (inputTextureTop, textureCoordinate) फ़ंक्शन को घुमाने, अनुवाद करने और स्केल करने के लिए इसे बनाने से पहले बनावट कोऑर्डिनेट.एक्सई पर कुछ 2 डी रूपांतरण कर सकता था? – abix

+0

abix मेरे पास कुछ ओपनक्ल कोड है जो हम पिक्सेल के लिए स्रोत कॉर्ड के रिवर्स ट्रांसफॉर्म लुकअप करने के लिए करते थे, यहां एक गिस्ट लिंक है https://gist.github.com/victusfate/bdbed266a73a19f81a94 –