سؤال

بدأت ألعب مع OpenGL ES 1.0 وواجهت مشكلة (المبتدئين): حاولت تعيين نسيج مربع إلى المكعب الذي وصفته المثلثات.

    // Turn necessary features on
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_SRC_COLOR);
    glEnable(GL_CULL_FACE);
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  

    // Bind the number of textures we need, in this case one.
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    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_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

//Drawing code
static GLfloat rot = 0.0;

static const Vertex3D vertices[] = {
    -1.0f,-1.0f,-1.0f, //0  00  
     1.0f,-1.0f,-1.0f, //1  10
     1.0f, 1.0f,-1.0f, //2  11
    -1.0f, 1.0f,-1.0f, //3  01      
};


static const int vertexCnt = 3 * 2;

static const GLubyte cube[] = {
    3,0,2,
    1,2,0,
};

static const GLfloat texCoords[] = {
    0,1,
    0,0,
    1,1,
    1,0,
    1,1,
    0,0,
};


glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(0.0f, 0.0f, -3.0f);

glBindTexture(GL_TEXTURE_2D, texture[0]);

glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_COLOR_MATERIAL);


glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);

//glColorPointer(4, GL_FLOAT, 0, colors);
glNormalPointer(GL_FLOAT, 0, normals);



glDrawElements(GL_TRIANGLES, vertexCnt, GL_UNSIGNED_BYTE, cube);


glDisableClientState(GL_VERTEX_ARRAY);
//glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

الآن ، بعد محاولات Zillion ، لا يمكنني الحصول عليها من أجل جوانب أخرى ... هل هناك بعض القاعدة للحالة عند رسم خرائط الملمس المربع للمثلث؟

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

شكرا جزيلا

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

المحلول

تمامًا مثل الآخرين ، لا أعتقد أن هناك خدعة لتعيين قوامك الرباعي على المثلثات.

المشكلة الرئيسية التي تواجهها هي بسبب الانقطاع في منسقات الملمس لكل زاوية. إذا كانت إحدى الزوايا مثل بعض التنسيقات للأشعة فوق البنفسجية {u ، v} لوجه واحد ، فهذا لا يعني أنه سيكون له نفس القيمة للوجوه الأخرى اللتين تشتركان في قمة الرأس. من الممكن العثور على رسم خرائط بحيث يكون الأشعة فوق البنفسجية فريدة من نوعها في كل ركن من أركان المكعب (مشترك من قبل 3 وجوه) ولهذا فإن جميع قيم الأشعة فوق البنفسجية الأربعة ({0،0} ، {1،0} ، {1،1} و {0،1}) موجودة على كل وجه ولكن بعد ذلك سيتم تشويه بعض القوام تمامًا. حاول التحقق من ذلك على قطعة من الورق: {1،1} ليس دائمًا على عكس {0،0}.

ستكون أسهل طريقة للبدء بها ، هي إعلان 6 كواد صريح ، كل منها يتكون من 2 مثلث. يمنحك ذلك ما مجموعه 24 رأسًا (24 موقعًا و 24 منسقًا Tex ، متشابكًا أم لا) و 36 مؤشرًا (6 كواد يتكون من مثلثتين ، 6 * 2 * 3 = 36).

إليك رمزك الذي تم تحديثه لعرض مكعب (قد يكون هناك بعض مشكلة التعويذة ، لذا فقد قمت بتعطيل إعدام الوجه للتأكد):

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);

static const float vertices[] = {
        0.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,

        0.0f, 1.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        1.0f, 1.0f, 1.0f,
        1.0f, 0.0f, 1.0f,

        0.0f, 1.0f, 1.0f,
        1.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,

        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f,

        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 1.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 1.0f,

        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 0.0f, 1.0f
        };


static const int vertexCnt = 6 * 4;

static const GLubyte cube[] = {
     0,  1,  2,  1,  2,  3,
     4,  5,  6,  5,  6,  7,
     8,  9, 10,  9, 10, 11,
    12, 13, 14, 13, 14, 15,
    16, 17, 18, 17, 18, 19,
    20, 21, 22, 21, 22, 23 
};

static const GLfloat texCoords[] = {
    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,

    1.0f, 0.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,
    0.0f, 1.0f,

    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,

    0.0f, 1.0f,
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,

    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,

    1.0f, 0.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,
    0.0f, 1.0f
    };

glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//glLoadIdentity();

//glTranslatef(0.0f, 0.0f, -3.0f);
glRotatef(3.1415927f, 1.0f, 1.0f, 0.0f);

glBindTexture(GL_TEXTURE_2D, spriteTexture);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, cube);

نصائح أخرى

لم أحاول أن أجعل من خلال قوائم قمة الرأس الخاصة بك ، لكن بلدي خمن هل لديك إحداثياتك تمامًا من الفوضى ورسم الخرائط بشكل خاطئ ، فقد حددت تنسيق المؤسسة الفهرس بشكل غير صحيح ، أو كنت قد تم تشغيل الوجه الخلفي ، وبعض رؤوسك في الترتيب الخاطئ.

أما بالنسبة لإحداثيات الملمس ، فلا ينبغي أن تكون هناك خدعة مع رسم الخرائط للمثلثات مقارنة بالوازم. سيكون عليك فقط الحصول على 6 إحداثيات نسيج حيث كان لديك في السابق أربعة ، نظرًا لوجود 6 رؤوس (تكراران لكل وجه). قد تكون قادرًا على تجنب الازدواجية باستخدام مخزن المؤسسة الفهرس ، كما لديك مع المكعب.

أما بالنسبة لمشكلة إعدام الوجه المحتملة ، فيجب عليك تحديد رؤوسك بنفس الترتيب في كل مرة. في اتجاه عقارب الساعة ، فيما يتعلق بالاتجاه الذي سيواجهه الملمس ، أو كل ذلك في اتجاه عقارب الساعة.

ما هي الأوامر التي تستخدمها لإعداد خط أنابيب OpenGL الخاص بك ، وما الأوامر التي تستخدمها لرسم تلك القمم؟ الرجاء إضافة الرمز المقابل إلى السؤال.

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