Связывание / рендеринг текстур OpenGL

Это моя первая попытка заставить наложение текстуры работать.

Это моя реализация:

Глобальные поля:

GLuint texture[big];            // Storage for some Textures
int globalcounter;

Mesh Draw:

ApplyMaterial(mesh->Materials());  //set material properties,works fine
DrawSingleObject(*mesh);

Метод розыгрыша:

DrawSingleObject(Mesh& p){

QList<Face>& faces=p.Faces();
int NumberOfFaces=faces.count();
QList<Vector3D>& normals =p.Normals();

glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glGenTextures(1, &texture[globalcounter]);                  // Create The Texture
glBindTexture(GL_TEXTURE_2D, texture[globalcounter]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256 , 256 , 0, GL_RGB, GL_UNSIGNED_BYTE, p.Mat().GetTexture()->Data() );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

for (int t = 0; t < NumberOfFaces; ++t) {
Face& f = faces[t];
GLenum face_mode;
int* lista=f.arrayVertici;
const QList<Vector3D> vertices=p.Vertices();

int* listaNorm=f.normalIndex;
switch(f.VertexNumber) {
case 1:
face_mode = GL_POINTS;
glBegin(face_mode);
if(hasNormals)
glNormal3fv(&((normals[listaNorm[0]]).pos[0]));
glTexCoord2f(?);
glVertex3fv(&vertices[lista[0]].pos[0]);
break;
case 2:
face_mode = GL_LINES;
glBegin(face_mode);
if(hasNormals){
glNormal3fv(&((normals[(f.normalIndex)[0]]).pos[0]));
glTexCoord2f(?);
glVertex3fv(&vertices[lista[0]].pos[0]);
glNormal3fv(&((normals[(f.normalIndex)[1]]).pos[0]));
glTexCoord2f(?);
glVertex3fv(&vertices[lista[1]].pos[0]);
}
else{
glVertex3fv(&vertices[lista[0]].pos[0]);
glVertex3fv(&vertices[lista[1]].pos[0]);
}
break;
case 3:
face_mode = GL_TRIANGLES;
glBegin(face_mode);
if(hasNormals){
glNormal3fv(&normals[(f.normalIndex)[0]].pos[0]);
glTexCoord2f(?);
glVertex3fv(&vertices[lista[0]].pos[0]);
glNormal3fv(&normals[(f.normalIndex)[1]].pos[0]);
glTexCoord2f(?);
glVertex3fv(&vertices[lista[1]].pos[0]);
glNormal3fv(&normals[(f.normalIndex)[2]].pos[0]);
glTexCoord2f(?);
glVertex3fv(&vertices[lista[2]].pos[0]);

}
else{
glVertex3fv(&vertices[lista[0]].pos[0]);
glVertex3fv(&vertices[lista[1]].pos[0]);
glVertex3fv(&vertices[lista[2]].pos[0]);
}
break;
default: face_mode = GL_POLYGON; break;
}
glEnd();

}
glDisable(GL_TEXTURE_2D);
}

Сетка имеет следующие поля:

QList<Vector3D> mTextureCoords;     //contains Textures coordinates
Material mMat;

Материал имеет это поле:

Texture* mTexture;

Текстура имеет это поле:

QImage* mImage;
a dedicated pointer to mImage->bits()

Текстура теперь корректно загружается в mImage.

Вопросы:

  • Привязка: правильно ли связывать текстуру до прорисовки вершины? Это правильная реализация?
  • Не могли бы вы объяснить мне, как использовать текстурные координаты Vector3D для загрузки текстуры в конкретную сетку? Я думаю, что моя основная проблема заключается в том, что я рендерим итерации по граням, в то время как список вершин текстур является общим (привязанным к сетке, а не к граням).

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]