2010-11-10 4 views
0

я был действительно нравится играть с OpenGl и последовали некоторые примеры и т.д.iPhone OpenGL: Текстурирование вопрос куб

Мой вопрос текстурирования куб. Большинство боковых текстур тонкие (спереди, сзади, слева), но справа - сплошной беспорядок.

Мой куб

// cube 
static const GLfloat cubeVertices[] = { 
    -5.0f, 15.0f, 5.0f, 
    5.0f, 15.0f, 5.0f, 
    5.0f,0.0f, 5.0f, 
    -5.0f,0.0f, 5.0f, 
    -5.0f, 15.0f,-5.0f, 
    5.0f, 15.0f,-5.0f, 
    5.0f,0.0f,-5.0f, 
    -5.0f,0.0f,-5.0f 
}; 

static const GLubyte cubeNumberOfIndices = 36; 

const GLubyte cubeVertexFaces[] = { 
    0, 1, 5, // Half of top face 
    0, 5, 4, // Other half of top face 
    4, 6, 5, // Half of front face 
    4, 6, 7, // Other half of front face 
    0, 1, 2, // Half of back face 
    0, 3, 2, // Other half of back face 
    1, 2, 5, // Half of right face 
    2, 5, 6, // Other half of right face 
    0, 3, 4, // Half of left face 
    7, 4, 3, // Other half of left face 
    3, 6, 2, // Half of bottom face 
    6, 7, 3, // Other half of bottom face 
}; 

Моя Texture карта

const GLshort squareTextureCoords2[] = { 
    0, 5, // top left 
    0, 0, // bottom left 
    15, 0, //bottom right 
    15, 5 //top right 
}; 

Мой куб код

//tell GL about our texture 
    glBindTexture(GL_TEXTURE_2D, 1); 
    glTexCoordPointer(2, GL_SHORT, 0, squareTextureCoords2); 

    glVertexPointer(3, GL_FLOAT, 0, cubeVertices); 

    for(int i = 0; i < cubeNumberOfIndices; i += 3) { 
     //glColor4ub(cubeFaceColors[colorIndex], cubeFaceColors[colorIndex+1], cubeFaceColors[colorIndex+2], cubeFaceColors[colorIndex+3]); 
     int face = (i/3.0); 
     if (face % 2 != 0.0) { 
     } 
     glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, &cubeVertexFaces[i]); 
} 

Так как я уже говорил, все делает, но с одной стороны куба (не могу видеть вершины и внизу так не волнуйтесь) текстура идет все странно

Благодаря

UPDATE **

теперь я попробовал эти COORDS и текстуры не отображается на каждой стороне его текстурами его спереди назад и поэтому стороны, как линии от другого края текстуры , Я должен быть близок к взлому

const GLfloat squareTextureCoords3[] = { 
    // Front face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Top face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Rear face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Bottom face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Left face 
    5, 5,  // top left 
    0, 5,  // bottom left 
    0, 0,  // bottom right 
    5, 0,  // top right 

    // Right face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 
}; 

ответ

3

Прежде всего, чтобы описать восемь вершин, вам нужны восемь координат текстуры. Вы поставляете буфер, содержащий только четыре, поэтому поведение технически не определено (и, вероятно, будет зависеть от того, что, если что-либо, ваш компилятор помещает в память после массива).

Также неверно передавать константу как имя текстуры в glBindTexture. Вы должны передать все, что glGenTextures дал вам раньше.

Даже если эти проблемы были исправлены, конечно, когда вы думаете об этом, координаты текстуры на грани грани не будут очень полезны, если вы твердо придерживаетесь всего восьми вершин? Это означает, что вам нужно найти координаты текстуры для каждой вершины, которые имеют смысл для каждой связанной грани. Попробуйте сделать эскиз на бумаге - я не уверен, что это возможно. Чтобы этого не произошло, вам нужно предоставить повторяющиеся позиции вершин с разными координатами текстуры.

EDIT: пример геометрии для куба, где каждое лицо имеет совершенно уникальный набор вершин (напечатанный непосредственно здесь, проверялось, чтобы сделать точку):

// this is unchanged from your original 
static const GLfloat squareTextureCoords3[] = { 
    // Front face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Top face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Rear face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Bottom face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 

    // Left face 
    5, 5,  // top left 
    0, 5,  // bottom left 
    0, 0,  // bottom right 
    5, 0,  // top right 

    // Right face 
    0, 5,  // top left 
    0, 0,  // bottom left 
    5, 0,  // bottom right 
    5, 5,  // top right 
}; 

// this is changed, to match the tex coord list 
static const GLfloat cubeVertices[] = { 
    // front face 
    -5.0f, 15.0f, 5.0f, 
    5.0f, 15.0f, 5.0f, 
    5.0f, 0.0f, 5.0f, 
    -5.0f, 0.0f, 5.0f, 

    // top face 
    -5.0f, 15.0f, 5.0f, 
    5.0f, 15.0f, 5.0f, 
    5.0f, 15.0f,-5.0f, 
    -5.0f, 15.0f,-5.0f,   

    // rear face 
    -5.0f, 15.0f,-5.0f, 
    5.0f, 15.0f,-5.0f, 
    5.0f,0.0f,-5.0f, 
    -5.0f,0.0f,-5.0f 

    // bottom face 
    -5.0f, 0.0f, 5.0f, 
    5.0f, 0.0f, 5.0f, 
    5.0f, 0.0f,-5.0f, 
    -5.0f, 0.0f,-5.0f, 

    // left face 
    -5.0f, 0.0f, 5.0f, 
    -5.0f, 0.0f,-5.0f, 
    -5.0f, 15.0f,-5.0f,   
    -5.0f, 15.0f, 5.0f, 

    // right face 
    5.0f, 0.0f, 5.0f, 
    5.0f, 0.0f,-5.0f, 
    5.0f, 15.0f,-5.0f,   
    5.0f, 15.0f, 5.0f, 
}; 

// this is changed also, to match the new arrays above 
const GLubyte cubeVertexFaces[] = { 
    4, 5, 6, // Half of top face 
    4, 6, 7, // Other half of top face 
    0, 1, 2, // Half of front face 
    0, 2, 3, // Other half of front face 
    8, 9, 10, // Half of back face 
    8, 10, 11, // Other half of back face 
    20, 21, 22, // Half of right face 
    20, 22, 23, // Other half of right face 
    16, 17, 18, // Half of left face 
    16, 18, 19, // Other half of left face 
    12, 13, 14, // Half of bottom face 
    12, 14, 15, // Other half of bottom face 
}; 

Другой код остается тем же самым. Главное в том, что в OpenGL вы не можете отдельно индексировать положения вершин и координаты текстуры. Игнорируя возможность цветов, нормалей и т. Д., Описание вершины в OpenGL - это одна позиция с одной координатой текстуры.

+0

Здравствуйте, спасибо за Ваш ответ. Я использую примеры из книг и т. Д., Чтобы создать свой код. Как бы вы шли по текстурированию куба. Я действительно новичок в этом, и у меня все работает так, как я хочу (намного больше кода), за исключением этого кровавого текстурирования. – Burf2000

+0

В качестве первого шага просто используйте 24 вершины - по четыре для каждого лица, каждый со своим набором текстурных координат , Поэтому сохраните ранее добавленный squareTextureCoords3, но разверните массив cubeVertices и настройте свой cubeVertexFaces. Теперь я должен броситься из своего стола, но я попытаюсь привести пример позже вечером, если проблема остается открытой. – Tommy

0

Попробуйте

const GLubyte cubeVertexFaces[] = { 
... 
    1, 5, 2, // Half of right face 
    6, 2, 5, // Other half of right face 
... 
}; 
+0

Нет, не работает, я думаю, что это проблема с текстурными коордами – Burf2000

Смежные вопросы