/ / OpenGL के सामान्य मानचित्रण के मुद्दे - सामान्य रूप से गलत दिशा का सामना करना पड़ रहा है? - c ++, opengl, glsl, मानदंड

ओपनजीएल सामान्य मैपिंग मुद्दे - संभावित रूप से गलत दिशा का सामना करने वाले सामान्य? - सी ++, opengl, glsl, मानक

मैं वर्तमान में अपने पहले ओपनजीएल आधारित गेम इंजन पर काम कर रहा हूं। मुझे एक सुविधा के रूप में सामान्य मैपिंग की आवश्यकता है, लेकिन यह सही ढंग से काम नहीं कर रहा है।

यहाँ क्या हो रहा है का एक एनीमेशन है

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

यहाँ मेरे कोड के प्रासंगिक टुकड़े हैं:

स्पर्शरेखा और बितांग उत्पन्न करना

        for(int k=0;k<(int)mb->getIndexCount();k+=3)
{
unsigned int i1 = mb->getIndex(k);
unsigned int i2 = mb->getIndex(k+1);
unsigned int i3 = mb->getIndex(k+2);

JGE_v3f v0 = mb->getVertexPosition(i1);
JGE_v3f v1 = mb->getVertexPosition(i2);
JGE_v3f v2 = mb->getVertexPosition(i3);

JGE_v2f uv0 = mb->getVertexUV(i1);
JGE_v2f uv1 = mb->getVertexUV(i2);
JGE_v2f uv2 = mb->getVertexUV(i3);

JGE_v3f deltaPos1 = v1-v0;
JGE_v3f deltaPos2 = v2-v0;
JGE_v2f deltaUV1 = uv1-uv0;
JGE_v2f deltaUV2 = uv2-uv0;

float ur = deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x;

if(ur != 0)
{
float r = 1.0 / ur;

JGE_v3f tangent;
JGE_v3f bitangent;

tangent = ((deltaPos1 * deltaUV2.y) - (deltaPos2 * deltaUV1.y)) * r;
tangent.normalize();

bitangent = ((deltaPos1 * -deltaUV2.x) + (deltaPos2 * deltaUV1.x)) * r;
bitangent.normalize();

tans[i1] += tangent;
tans[i2] += tangent;
tans[i3] += tangent;
btans[i1] += bitangent;
btans[i2] += bitangent;
btans[i3] += bitangent;
}
}

यहाँ स्पर्शकों की एक तस्वीर है

वर्टेक्स शेडर में TBN मैट्रिक्स की गणना (सामान्य गैर-समान पैमानों के लिए सामान्य सही है)

vec3 T = normalize((mVW * vec4(tangent, 0.0)).xyz);
tnormal = normalize((mNormal * n).xyz);
vec3 B = normalize((mVW * vec4(bitangent, 0.0)).xyz);

tmTBN = transpose(mat3(
T.x, B.x, tnormal.x,
T.y, B.y, tnormal.y,
T.z, B.z, tnormal.z));

अंत में यहाँ वह जगह है जहाँ मैं सामान्य मानचित्र से नमूने का सामान्य उपयोग करता हूँ और इसे फ्रैगमेंट शैडर में स्थान देखने के लिए बदलने का प्रयास करता हूँ

fnormal = normalize(nmapcolor.xyz * 2.0 - 1.0);
fnormal = normalize(tmTBN * fnormal);

"nmapcolor" सामान्य नक्शे से नमूना रंग है। "असामान्य" तब प्रकाश गणना में सामान्य की तरह उपयोग किया जाता है।

मैं इतने लंबे समय से इसे हल करने की कोशिश कर रहा हूं और इस काम को पाने का कोई तरीका नहीं है। किसी भी तरह की सहायता का स्वागत किया जाएगा।

EDIT - मैंने विश्व अंतरिक्ष में काम करने के लिए कोड को थोड़ा संशोधित किया और परिणामों को आउटपुट किया। बड़े प्लेटफ़ॉर्म में सामान्य मैपिंग नहीं होती है (और यह सही तरीके से काम करता है) जबकि छोटा प्लेटफ़ॉर्म करता है। विश्व अंतरिक्ष सामान्य

मैंने जोड़ा कि मानदंड किस दिशा में सामना कर रहे हैं। वे दोनों आम तौर पर एक ही रंग के होने चाहिए, लेकिन वे "स्पष्ट रूप से भिन्न होते हैं। एमटीबीएन मैट्रिक्स मैट्रिक्स नहीं लगता है" स्पर्शरेखा स्थान को दुनिया में सामान्य रूप से परिवर्तित करना (और सामान्य रूप से देखें) ठीक से अंतरिक्ष।

उत्तर:

जवाब के लिए 0 № 1

खैर ... मैंने समस्या हल कर दी। मेरा सामान्य मानचित्रण कार्यान्वयन सही था। समस्या वास्तव में मेरी बनावट वर्ग में थी। यह निश्चित रूप से, मेरा पहली बार ओपनग्लिंग रेंडरिंग इंजन लिख रहा है, और मुझे यह महसूस नहीं हुआ कि मेरी बनावट वर्ग में अनलॉक () फ़ंक्शन ने मेरे सभी बनावटों को सामान्य नक्शे सहित GL_SRGB_ALPHA के रूप में सहेजा है। केवल फैलाना नक्शा बनावट GL_SRGB_ALPHA होना चाहिए। GL_RGBA समस्या को ठीक करने के लिए अस्थायी रूप से सभी बनावट को लोड करने के लिए मजबूर करता है। "विश्वास नहीं कर सकता कि मुझे यह समस्या 11 महीने से थी, केवल यह पता लगाने के लिए कि यह बहुत छोटा था।