سؤال

أحاول رسم نسيج مقلوب جزئيًا فوق رباعي ملون ، بحيث يضيء اللون من خلال الجزء الشفاف ، مما يجعل مخططًا تفصيليًا. هذا هو الرمز:

// Setup
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

// (...)
// Get image bits in object 't'
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
// (...)

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

// Underlying coloured quad
glColor4d(0.0, 1.0, 0.0, 1.0);    
glBindTexture(GL_TEXTURE_2D, 0); 
glBegin(GL_QUADS);
  glVertex3d(coords11.first, coords11.second, -0.001);
  glVertex3d(coords12.first, coords12.second, -0.001);
  glVertex3d(coords21.first, coords21.second, -0.001);
  glVertex3d(coords22.first, coords22.second, -0.001);
glEnd();

// Textured quad    
glColor4d(1.0, 1.0, 1.0, 0.5);
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]); 
glBegin(GL_QUADS);
  glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0);
  glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0);
  glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0);
  glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0);
glEnd();

الملمس أسود إلا حيث يحتوي على الخطوط العريضة للقلعة ؛ هذا الجزء شفاف (والأبيض). السلوك المتوقع ، لذلك ، هو مستطيل أسود مع مخطط أخضر. ما أحصل عليه بدلاً من ذلك هو مستطيل أخضر مع مخطط أبيض:

لقطة شاشة

هذا مع ألفا على رباعية محكم تم تعيينه على 0.5. إذا قمت بدلاً من ذلك بتعيينه على 1.0 ، فأنا أحصل على الملمس دون أي شفافية ، كما هو الحال في (حسنًا ، لا يمكن نشر لقطة الشاشة الثانية كرابط ؛ إنه في s330.photobucket.com/albums/l412/twbwar/؟action = view¤t = استبدال 10.png). مع ألفا من 0 ، أحصل على مستطيل أخضر. لذلك يبدو لي أن الربع المحكم يتم مزجه باستخدام قيمة ألفا التي تم تعيينها بواسطة Glcolor4D ، بدلاً من القيمة من الملمس ، وهو ما كنت أتوقعه من Gl_replace. (جربت GL_DECAL و GL_MDOUNER أيضًا ، لكنني لم أتمكن من الحصول على السلوك الذي أردته.) هل يمكن لأي شخص أن يخبرني كيفية جعل OpenGL يستخدم الملمس ، وليس الربع ، ألفا للمزج؟

هل كانت مفيدة؟

المحلول

استعد لرحلة أسفل حارة الذاكرة.

glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);

أن 3 في هناك مشكلتك. يذكر الجزء الصحيح من الوسيطات (RGBA+unsigned_byte) ما هو نوع بيانات المصدر الخاص بك. ال المكان المقصود نوع البيانات هو الوسيطة الثالثة (أي ما الذي سيخزن GL نسيجك AS).

كما يحدث ، عند إنشاء GL 1.0 ، كان التنسيق أبسط إلى حد ما. لذلك كانت المعلمة مطلوبة فقط لتحديد عدد القنوات التي تريدها لملمسك النهائي ، مع التعيين

1=GL_LUMINANCE
2=GL_LUMINANCE_ALPHA
3=GL_RGB
4=GL_RGBA

أعتقد أن هذا الاستخدام محبط ، ولكن كما ترون ، لا يزال يعمل.

لذلك ... يتم تخزين نسيجك كـ GL_RGB ، بدون ألفا.

الباقي هو تطبيق بسيط للمواصفات. استبدال على نسيج بتنسيق داخلي RGB يفعل final_color=texture_color و final_alpha=fragment_alpha (ويعرف أيضا باسم المصدر من glcolor في قضيتك). نرى هذه صفحة الرجل بالنسبة للجداول الكاملة لبيئة الملمس على أساس التنسيقات الداخلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top