Наложение текстуры на одну поверхность куба не работает - PullRequest
1 голос
/ 03 ноября 2011

Я пытаюсь нанести текстуру на одну поверхность куба (если перед плоскостью XY текстура будет обращена к вам).

Никакая текстура не рисуется, только каркас, и яинтересно что я делаю не так.Я думаю, что это координаты вершины?

Вот код:

struct paperVertex {
    D3DXVECTOR3 pos;
    DWORD color;        // The vertex color
    D3DXVECTOR2 texCoor;
    paperVertex(D3DXVECTOR3 p, DWORD c, D3DXVECTOR2 t) {pos = p; color = c; texCoor = t;}
    paperVertex() {pos = D3DXVECTOR3(0,0,0); color = 0; texCoor = D3DXVECTOR2(0,0);}
};

D3DCOLOR color1 = D3DCOLOR_XRGB(255, 255, 255);
D3DCOLOR color2 = D3DCOLOR_XRGB(200, 200, 200);
vertices[0] = paperVertex(D3DXVECTOR3(-1.0f, -1.0f, -1.0f), color1, D3DXVECTOR2(1,0));  // bottom left corner of tex
vertices[1] = paperVertex(D3DXVECTOR3(-1.0f,  1.0f, -1.0f), color1, D3DXVECTOR2(0,0));  // top left corner of tex
vertices[2] = paperVertex(D3DXVECTOR3( 1.0f,  1.0f, -1.0f), color1, D3DXVECTOR2(0,1));  // top right corner of tex
vertices[3] = paperVertex(D3DXVECTOR3(1.0f, -1.0f, -1.0f), color1, D3DXVECTOR2(1,1));   // bottom right corner of tex
vertices[4] = paperVertex(D3DXVECTOR3(-1.0f, -1.0f,  1.0f), color1, D3DXVECTOR2(0,0));
vertices[5] = paperVertex(D3DXVECTOR3(-1.0f,  1.0f,  1.0f), color2, D3DXVECTOR2(0,0));
vertices[6] = paperVertex(D3DXVECTOR3(1.0f,  1.0f,  1.0f), color2, D3DXVECTOR2(0,0));
vertices[7] = paperVertex(D3DXVECTOR3(1.0f, -1.0f,  1.0f), color1, D3DXVECTOR2(0,0));

D3DXCreateTextureFromFile( md3dDev, "texture.bmp", &gTexture);
md3dDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
md3dDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

md3dDev->SetTexture(0, gTexture);
md3dDev->SetStreamSource(0, mVtxBuf, 0, sizeof(paperVertex));
md3dDev->SetVertexDeclaration(paperDecl);
md3dDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
md3dDev->SetIndices(mIndBuf);
md3dDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, VTX_NUM, 0, NUM_TRIANGLES);

1 Ответ

4 голосов
/ 03 ноября 2011

отказ от ответственности: У меня нет опыта работы с Direct3D, но есть опыт работы с OpenGL и общей компьютерной графикой.А поскольку базовые концепции на самом деле не отличаются, я пытаюсь ответить, в чьей правильности я на 99% уверен.

Вы вызываете md3dDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME) непосредственно перед рендерингом и задаетесь вопросом, почему рисуется только каркас?

Имейте в виду, что использование текстуры волшебным образом не превращает каркасную модель в твердотельную модель.Это все еще модель каркаса с текстурой, примененной только к каркасу.Вы можете нарисовать только весь примитив в виде каркаса или нет.

Аналогично, использование текстурных координат (0,0) магическим образом не отключает текстурирование для отдельных граней.Вы можете нарисовать только весь примитив с текстурой или нет, хотя вы можете поиграть с координатами текстуры и режимом обтекания текстуры (и, возможно, границей текстуры), чтобы «нетекстурированные» грани использовали однородный цвет текстуры и, таким образом, выглядит как не текстурированный.

Но в целом для достижения таких отклоняющихся стилей рендеринга (как текстурированный / не текстурированный, но особенно каркасный / твердый) в одном примитиве вы не обойдетеразделение примитива на несколько и рисование каждого из них со своим выделенным стилем рендеринга.

РЕДАКТИРОВАТЬ: Согласно вашему комментарию: Если вам не нужен каркас, зачем тогда его включать?Помимо отключения каркаса, с вашими текущими координатами текстуры другие лица будут иметь не только один цвет из текстуры, но и странную искаженную версию текстуры.Это связано с тем, что ваши вершины (и их координаты текстуры) совместно используются разными гранями, но координаты текстуры в данный момент создаются только для того, чтобы передняя грань выглядела разумно.

В такой ситуации вы не будетеобойти дублирующие вершины, так что каждая грань использует набор из 4 уникальных вершин.В случае с кубом вам на самом деле больше не понадобится индексный массив, потому что для каждой грани нужны свои вершины.Это связано с тем фактом, что вершина концептуально представляет все атрибуты вершины (position, color, texCoord, ...), и вы не можете иметь две вершины, разделяющие позицию, но имеющие разные координаты текстуры (вы можете, но вам нужнодве разные вершины).После того, как вы продублировали вершины соответствующим образом, вы можете дать каждой из угловых вершин соответствующие координаты текстуры (что будет обычным квадратом [0,1], если вы хотите, чтобы они были текстурированы нормально, или все 0, если вы хотите, чтобы они имелиодин цвет, в данном случае это цвет нижнего левого (или верхнего левого в D3D?) угла текстуры).

Та же проблема возникает, если вы хотите осветить куб и нуждаетесь в нормали для каждой гранивместо интерполированных по каждой вершине нормалей.В этом случае вы также должны ввести повторяющиеся вершины, отклоняющиеся только в их обычном атрибуте.Всегда имейте в виду, что вершина концептуально состоит из всех атрибутов вершины, и если две вершины имеют одинаковую позицию, но разный цвет / normal / texCoord / ... они концептуально (и практически) разные вершины.

...