سؤال

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

أنا أستخدم VBO لكل وجه يتم إنشاؤه باستخدام الطريقة التالية:

void Planet::setVertexBufferObject()
{
 Vertex* vertices;
 int currentVertex;
 Vertex* vertex;

 for(int i = 0; i < 6; i++)
 {
  // bottom face
  if(i == 0)
  {
   glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);    
  }
  // top face
  else if(i == 1)
  {
   glBindBuffer(GL_ARRAY_BUFFER, topVBO);    
  }
  // front face
  else if(i == 2)
  {
   glBindBuffer(GL_ARRAY_BUFFER, frontVBO);    
  }
  // back face
  else if(i == 3)
  {
   glBindBuffer(GL_ARRAY_BUFFER, backVBO);    
  }
  // left face
  else if(i == 4)
  {
   glBindBuffer(GL_ARRAY_BUFFER, leftVBO);    
  }
  // right face
  else
  {
   glBindBuffer(GL_ARRAY_BUFFER, rightVBO);    
  } 

  vertices = (Vertex*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

  currentVertex = 0;

  for(int x = 0; x < size; x++)
  {
   for(int z = 0; z < size; z++)
   {
    currentVertex = z * size + x;

    vertex = &vertices[currentVertex];

    vertex->xTextureCoord = (x * 1.0f) / 512.0f;
    vertex->zTextureCoord = (z * 1.0f) / 512.0f;

    Vector3 normal;

    vertex->xNormal = normal.x;
    vertex->yNormal = normal.y;
    vertex->zNormal = normal.z;

    vertex->x = heightMapCubeFace[i][x][z][0];
    vertex->y = heightMapCubeFace[i][x][z][1];
    vertex->z = heightMapCubeFace[i][x][z][2];

    vertex->x *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->y *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->z *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
   }
  }
  glUnmapBuffer(GL_ARRAY_BUFFER);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
}

لقد تركت طريقة setIndExbufferObject () لأن ذلك يعمل بشكل جيد.

أنا بعد ذلك أقوم بتقديم المجال باستخدام هذه الطريقة:

void Planet::render()
{
    // bottom face

    glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bottomIBO);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(6 * sizeof(float)));

    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(3 * sizeof(float)));

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));

 TextureManager::Inst()->BindTexture(textueIDs[0]);
 glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);
 glDrawElements(GL_TRIANGLE_STRIP, numberOfIndices, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

 // next face and so on...

يتم تحميل القوام في استخدام صورة مجانية ، كما ترون من الكود أعلاه ، أنا فقط أستخدم Meoffe Meample Manager الذي جاء مع FreeImage.

لماذا ربط الملمس لا يعمل؟

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

المحلول

لماذا ربط الملمس لا يعمل؟

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

بعد ذلك ، تحتاج إلى تضمين حالة خطأ GL أو على الأقل إظهار أنه ضمن الكود الذي تقوم به والفشل إذا لم ترد Glgeterror () GL_NO_ERROR.

تبدو حالة عنصر VBO / Draw معقولة على الرغم من أنك حذفت عمداً تعريف كائن المؤقت المؤقت للفهرس ، لذا سنأخذها على الإيمان بأنك ترسل مؤشرات حقيقية إلى مكالمة gldrawelements (). لفحص العقل ، قم بإجراء استدعاء GldrawElements () مع مؤشر المؤشرات الخام بدلاً من ربط VBO للعناصر.

لقد حذفت أيضًا تعريف نوع Vertex المطلوب لمعرفة ما إذا كانت الإزاحة التي تزودها بـ GltexCoordPointer () تتفق مع تعريف الهيكل.

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

إذا كانوا قد خلطوا معرفات الملمس ، فقم بإعداد وضع التفاف غير مدعوم ، فلا يقوم بتعيين مرشح التصنيع بما يتوافق مع miPmapping المتوقع (ON/OFF) لون الهندسة الأساسي ليس كما تتوقع - كل هذه الأشياء ستجعل التنسيق لا يعمل / يبدو أنه يعمل.

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

يمكنك أيضًا إيقاف تشغيل عمليات الرفع لتبسيط استكشاف الأخطاء وإصلاحها. تعطيل المزج ، واختبار العمق ، والمقص.

على افتراض أن نسيجك هو قوة بعدين أو يدعم التنفيذ الخاص بك NPOT ، جرب هذه الإعدادات في الحال قبل الرسم:

glDisable (gl_depth_test) ؛
glDisable (gl_blend) ؛
glDisable (gl_scissor_test) ؛
glcolor4f (1.0f ، 1.0f ، 1.0f ، 1.0f) ؛
GlbindTexture (gl_texture_2d ، texid) ؛
gltexenvi (gl_texture_env_mode ، gl_replace) ؛ // قم بإيقاف تشغيل التعديل
gltexparameteri (gl_texture_2d ، gl_texture_min_filter ، gl_linear) ؛ // قم بإيقاف تشغيل MIPMapping
gltexparameteri (gl_texture_2d ، gl_texture_wrap_s ، gl_clamp) ؛ // أوقف التكرار
gltexparameteri (gl_texture_2d ، gl_texture_wrap_t ، gl_clamp) ؛

نصائح أخرى

glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);

ماذا تحاول أن تفعل هنا؟

وحدة الملمس النشطة لا علاقة لها بكائن نسيج عشوائي.

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