2011-10-14 13 views
11

मैं जीएलएसएल खंड शेलर (ओपनजीएल ईएस 2.0) में नमूने के रूप में एनएक्सएम आकार के साथ एक बनावट पारित कर रहा हूं। पड़ोसी टेक्साल से टेक्सेल डेटा को पढ़ने का सही तरीका क्या है? मेरे पास खंड शेडर में "भिन्न" बनावट समन्वय नहीं है। मैं केवल बनावट की जानकारी पढ़ने के लिए खंड समन्वय का उपयोग कर सकता हूं।ओपनजीएल ईएस 2.0 में, एक नमूने से पड़ोसी ग्रंथों को कैसे पढ़ा जाए?

precision mediump float; 

uniform sampler2D Sampler; 

#define OFFSET 1.0 

void main() 
{ 

    vec2 T = gl_FragCoord.xy; 

    //Find neighboring velocities: 
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+OFFSET)).xy; 
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-OFFSET)).xy; 
    vec2 E = texture2D(Sampler,vec2(T.x+OFFSET,T.y)).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-OFFSET,T.y)).xy; 
} 

OFFSET मूल्य 1.0 या NxM आकार बनावट के लिए कुछ और किया जाना चाहिए है:

निम्नलिखित मेरी शेडर है, मुझे यकीन है कि अगर इसकी वास्तव में डाटा पढ़ने नहीं हूँ?

+0

आप यहां क्या करने की कोशिश कर रहे हैं? – IDWMaster

+0

@IDWMaster मुझे लगता है कि पड़ोसी टेक्साल मूल्यों का उपयोग करना, जैसा कि उन्होंने कहा था। मुझे नहीं पता कि कुछ अस्पष्ट कहां है या यदि यह मायने रखता है कि वह वास्तव में अंत में क्या हासिल करना चाहता है। –

+0

स्टैक ओवरव्लो में आपका स्वागत है, मुझे आशा है कि आप [एफएक्यू] (http://stackoverflow.com/faq#howtoask) पढ़ लेंगे। –

उत्तर

14

नीम अपने उत्तर में सही है कि बनावट समन्वय [0,1] में होना चाहिए। लेकिन ध्यान रखें, gl_FragCoord के मान [0, एन] एक्स [0, एम] में हैं (मान लें कि आपका व्यूपोर्ट एनएक्सएम भी है)। तो अगर आप एक समन्वय टुकड़ा करने के लिए 1 की भरपाई जोड़ने में सही कर रहे हैं, लेकिन इस राशि तो है स्क्रीन आकार से विभाजित किया (जो शायद बनावट आकार के समान है):

precision mediump float; 

uniform sampler2D Sampler; 
uniform vec2 invScreenSize; 

void main() 
{ 

    vec2 T = gl_FragCoord.xy; 

    //Find neighboring velocities: 
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+1.0)*invScreenSize).xy; 
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-1.0)*invScreenSize).xy; 
    vec2 E = texture2D(Sampler,vec2(T.x+1.0,T.y)*invScreenSize).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-1.0,T.y)*invScreenSize).xy; 
} 

जहां invScreenSize है शेडर में विभाजन को रोकने के लिए पारस्परिक स्क्रीन आकार (1/N, 1/M)

+0

धन्यवाद दोस्तों, यह अब काम करता है। OpenGL ES छायांकन भाषा विनिर्देश स्वयं texture2D उपयोग पर बहुत स्पष्ट नहीं है। – kal21

+1

@ kal21 वास्तव में किसी भी प्रारंभिक ओपनजीएल ट्यूटोरियल ने आपको बताया होगा कि बनावट [0,1] में सामान्यीकृत बनावट निर्देशांक द्वारा उपयोग की जाती है। –

4

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

मैं सलाह दूंगा कि आप ओपनजीएल ईएस छायांकन भाषा विनिर्देश की जांच करें ताकि यह सत्यापित किया जा सके कि बनावट समन्वय प्रारूप के बारे में मेरा दावा सही है (मैंने इसे कुछ महीने पहले किया था)। यह एक पीडीएफ है जो Google के साथ ढूंढना आसान है, और कहीं भी सभी अंतर्निहित कार्यों की एक सुविधाजनक सूची है।