2011-04-23 22 views
6

के साथ पिक्सेल सही बनावट मैपिंग आधुनिक ओपनजीएल में प्रोग्रामिंग करने का निर्णय लेने के बाद, मैंने फिक्स्ड फ़ंक्शन पाइपलाइन को पीछे छोड़ दिया है और मुझे पहले से ही वही कार्यक्षमता प्राप्त करने के बारे में पूरी तरह से यकीन नहीं है।आधुनिक ओपनजीएल

मैं बनावट आकार से मेल खाने वाले पिक्सेल सही आकार के साथ नक्शा क्वाड बनाने की कोशिश कर रहा हूं। उदाहरण के लिए, एक 128x128 बनावट नक्शा आकार में 128x128 के लिए।

यह मेरा वर्टेक्स शेडर है।

 

    #version 110 
    uniform float fade_factor;  
    uniform sampler2D textures[1]; 
    varying vec2 texcoord; 

    void main() 
    { 
     gl_FragColor = texture2D(textures[0], texcoord); 
    } 
 

मेरे शिखर डेटा ऐसी है, जहां w और ज चौड़ाई और बनावट की ऊंचाई रहे हैं प्रकार है:

 

    #version 110 
    uniform float xpos; 
    uniform float ypos; 
    uniform float tw; // texture width in pixels 
    uniform float th; // texture height in pixels 
    attribute vec4 position; 
    varying vec2 texcoord;   
void main() 
    { 
    mat4 projectionMatrix = mat4(2.0/600.0, 0.0, 0.0, -1.0, 
            0.0, 2.0/800.0, 0.0, -1.0, 
            0.0, 0.0, -1.0, 0.0, 
            0.0, 0.0, 0.0, 1.0); 

    gl_Position = position * projectionMatrix; 
    texcoord = (gl_Position.xy); 
    } 
 

यह मेरा टुकड़ा शेडर है।

 

    [ 
    0, 0, 
    w, 0, 
    w, h, 
    0, h 
    ] 
 

मैं एक 128x128 बनावट लोड और इन shaders के साथ मैं छवि 4 बार दोहराया देखें: http://i.stack.imgur.com/UY7Ts.jpg

कर सकते हैं सही रास्ते पर किसी को भी सलाह दे और बड़े पैमाने tw वें दिया अनुवाद करने में सक्षम होने के लिए, xpos , xpos वर्दी?

+0

हैलो, बाएं! StackOverflow में आपका स्वागत है। याद रखने के लिए कुछ चीजें- कृपया अपने कोड को चार रिक्त स्थान (या '{}' आइकन के साथ) इंडेंट करें ताकि यह ठीक से स्वरूपित हो। साथ ही, जब 'ओपनजीएल' टैग में पोस्ट करते समय, यह उपयोगी होता है जब आप अपना ओपनजीएल संस्करण निर्दिष्ट करते हैं। खासकर जब से आपके कोड के नमूने ओपनजीएल 2.0 की तरह लगते हैं जो वास्तव में उपयोगी है, लेकिन आज वास्तव में "आधुनिक" नहीं है। :) – Kos

+0

उत्तर के लिए धन्यवाद। यह आधुनिक ओपनजीएल (> = 3?) है क्योंकि मैं फिक्स्ड फ़ंक्शन पाइपलाइन का उपयोग नहीं कर रहा हूं, मेरे वर्टेक्स डेटा को सरणी में आपूर्ति की जाती है और बनावट नमूना शेडर्स के साथ किया जाता है। उस ने कहा, मैं अभी भी इसके लिए अपेक्षाकृत नया हूं इसलिए यदि मैं गलत हूं तो मुझे सही करें :) – Lefty

+0

संबंधित http://stackoverflow.com/questions/7922526/opengl-deterministic-rendering-between-gpu-vendor –

उत्तर

6

इस के साथ एक समस्या है:

mat4 projectionMatrix = mat4(2.0/600.0, 0.0, 0.0, -1.0, 
            0.0, 2.0/800.0, 0.0, -1.0, 
            0.0, 0.0, -1.0, 0.0, 
            0.0, 0.0, 0.0, 1.0); 

gl_Position = position * projectionMatrix; 

परिवर्तन matices, सही साहचर्य हैं यानी आप विपरीत क्रम गुणा करना चाहिए। इसके अलावा आप आमतौर पर शेडर में प्रोजेक्शन मैट्रिक्स निर्दिष्ट नहीं करते हैं, आप इसे वर्दी के रूप में पास करते हैं। ओपनजीएल आपको प्रक्षेपण और मॉडलव्यू के लिए वर्दी का उपयोग करने के लिए तैयार करता है। ओपनजीएल -3 कोर में आप संगत रहने के लिए वर्दी नामों का पुन: उपयोग कर सकते हैं।

// predefined by OpenGL version < 3 core: 
#if __VERSION__ < 400 
uniform mat4 gl_ProjectionMatrix; 
uniform mat4 gl_ModelviewMatrx; 
uniform mat4 gl_ModelviewProjectionMatrix; // premultiplied gl_ProjectionMatrix * gl_ModelviewMatrix 
uniform mat4 gl_ModelviewInverseTranspose; // needed for transformin normals 

attribute vec4 gl_Vertex; 

varying vec4 gl_TexCoord[]; 
#endif 

void main() 
{ 
    gl_Position = gl_ModelviewProjectionMatrix * gl_Vertex; 
} 

इसके बाद आप यह समझना चाहिए कि बनावट निर्देशांक का पता नहीं बनावट पिक्सल (texels), लेकिन बनावट दिया नमूना बिंदु के साथ एक interpolating समारोह के रूप में समझा जाना चाहिए कि; बनावट 0 या 1 निर्देशांक टेक्नोलॉजी केंद्रों को हिट नहीं करते हैं, लेकिन इस प्रकार धुंधलापन के बीच बिल्कुल झूठ बोलते हैं। जब तक स्क्रीन आकार पर आपका ट्रैक्टर बनावट आयामों से बिल्कुल मेल खाता है तो यह ठीक है। लेकिन जैसे ही आप केवल एक उपजाऊ चीजें दिखाना चाहते हैं, दिलचस्प हो जाता है (मैं सटीक मैपिंग को समझने के लिए पाठक को एक अभ्यास के रूप में छोड़ देता हूं; संकेत: आपके पास शब्द 0.5/आयाम और (आयाम -1)/आयाम होगा समाधान में)

+0

इसकी संभावना है प्रश्न http://stackoverflow.com/questions/34952184/pixel-perfect-shader-in-unity आपके लिए आसान होगा, डीडब्ल्यू! : हे – Fattie