2009-04-15 19 views
5

मैंने Google पर यह शोध करने की कोशिश की है लेकिन मुझे कोई सुसंगत सरल उत्तर नहीं दिखता है। क्या ऐसा इसलिए है क्योंकि यह आसान नहीं है, या क्योंकि मैं सही कीवर्ड का उपयोग नहीं कर रहा हूं?मैं ओपनजीएल में बनावट को पारदर्शी कैसे बना सकता हूं?

फिर भी, यह प्रगति मैंने अभी तक की है।

  1. 2 वर्ग बनाने के लिए 8 शिखर बनाए गए।
  2. 200 बिट अल्फा मान (इसलिए, लगभग 80% पारदर्शी) के साथ एक बनावट बनाया।
  3. प्रत्येक वर्ग में एक ही बनावट को असाइन किया गया, जो सही ढंग से दिखाता है।
  4. नोटिस किया गया कि जब मैं 255 अल्फा के साथ बनावट का उपयोग करता हूं, तो यह उज्जवल प्रतीत होता है।

init निम्नलिखित की तरह कुछ है:

glClearColor(0.0, 0.0, 0.0, 0.0); 
glShadeModel(GL_FLAT); 
glEnable(GL_DEPTH_TEST); 

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

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glGenTextures(1, textureIds); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

int i, j; 
GLubyte pixel; 
for (i = 0; i < TEXTURE_HEIGHT; i++) 
{ 
    for (j = 0; j < TEXTURE_WIDTH; j++) 
    { 
     pixel = ((((i & 0x8) == 0)^((j & 0x8) == 0)) * 255); 
     texture[i][j][0] = pixel; 
     texture[i][j][1] = pixel; 
     texture[i][j][2] = pixel; 
     texture[i][j][3] = 200; 
    } 
} 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, 
    TEXTURE_WIDTH, TEXTURE_HEIGHT, 
    0, GL_RGBA, GL_UNSIGNED_BYTE, texture); 

यह कुछ हद तक पुस्तक में पृष्ठ 417 से कोड का टुकड़ा, ओपन प्रोग्रामिंग गाइड के समान है, और एक चेक पैटर्न बनाता है।

और फिर, प्रदर्शन समारोह में शामिल है ...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_TEXTURE_2D); 

// Use model view so that rotation value is literal, not added. 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// ... translation, etc ... 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right 
glEnd(); 

    // not neccecary to repeat, just good practice 
glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right 
glEnd(); 

glFlush(); 
glDisable(GL_TEXTURE_2D); 

glPopMatrix(); 

SwapBuffers(); 

तो, यह पृष्ठभूमि में एक 2 वर्ग renders; मैं पीछे बनावट के बजाय यह देख, लेकिन यह है कि वे पृष्ठभूमि के साथ मिश्रित किया जा रहा है कर रहे हैं (मैं इस मान क्योंकि वे 255 बिट 200 से थोड़ा अल्फा के साथ गहरा कर रहे हैं) लग रहा है कर सकते हैं ...

Transparent textures not working

के रूप में आप देख सकते हैं, कोई पारदर्शिता नहीं ... मैं इसे कैसे ठीक कर सकता हूं?

+0

में इस पर

अधिक आप TEXTURE_WIDTH – shoosh

+0

आह धन्यवाद के बजाय कि पाश में दो बार TEXTURE_HEIGHT है, लेकिन है कि कोई फर्क नहीं होगा के रूप में वे दोनों 64 कर रहे हैं। –

उत्तर

9

तो दूसरा उत्तर जो यहां था लेकिन हटा दिया गया था - आम तौर पर, अल्फा ब्लेंडिंग के लिए सही तरीके से काम करने के लिए आपको कैमरे की समन्वय प्रणाली में दूर से वस्तुओं को सॉर्ट करने की आवश्यकता होती है।
यही कारण है कि आपके बहुभुज पृष्ठभूमि के साथ मिश्रित हैं। आप पुष्टि कर सकते हैं कि गहराई से परीक्षण को अक्षम करके यह वास्तव में समस्या है। गहराई परीक्षण के बिना सभी टुकड़े प्रदर्शित होते हैं और आप अल्फा मिश्रण देखने में सक्षम होंगे। this page.

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