Как повернуть «верхнюю» текстуру неба с помощью DirectX9?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как повернуть «верхнюю» текстуру неба с помощью DirectX9?

Сообщение Anonymous »

Я работаю над разработкой и анимированием неба с помощью кубика. Поверхности, за исключением «верхнего», движутся таким образом, чтобы следует за друг другу. Тем не менее, я никогда не мог понять, как адаптировать «верхнюю» часть к этому движению, и пока я отключил ее. Ниже приведен код того, как я это сделал. Направление «верхнего» отключено, потому что, когда я включаю его, оно отделяется от других поверхностей и скольжения, как если бы оно было одиноким. В то время как окружающие направления прокручиваются в одном направлении (справа слева и т. Д.), Я подумал о том, чтобы анимировать «верхнюю» текстуру, чтобы вращаться, как колесо, и сопоставить ее с другими текстурами. Но я не смог добиться успеха. < /P>
Я был бы очень рад, если бы вы могли помочь мне с этим. Или, если бы вы могли направить меня по ссылке, которая может помочь ... < /p>
Я использую текстуру Cross Sky 4x3. (4096x3072) < /p>
с любовью. < /P>
void CSkyBox::GetCrossUVCoordinates(int faceIndex, float& uMin, float& uMax, float& vMin, float& vMax)
{
const float texWidth = 4096.0f;
const float texHeight = 3072.0f;

const float faceWidth = texWidth / 4.0f;
const float faceHeight = texHeight / 3.0f;

float pixelOverlapU = 1.0f / texWidth;
float pixelOverlapV = 1.0f / texHeight;

int col = 0, row = 0;

switch (faceIndex)
{
case 0: // (+Z)
col = 2; row = 1;
break;
case 1: // (-Z)
col = 0; row = 1;
break;
case 2: // (-X)
col = 1; row = 1;
break;
case 3: // (+X)
col = 3; row = 1;
break;
case 4: // (+Y)
col = 1; row = 0;
break;
case 5: // (-Y)
col = 1; row = 2;
break;
default:
uMin = 0.0f; uMax = 1.0f;
vMin = 0.0f; vMax = 1.0f;
return;
}

float pxMinU = col * faceWidth;
float pxMaxU = (col + 1) * faceWidth;
float pxMinV = row * faceHeight;
float pxMaxV = (row + 1) * faceHeight;

uMin = (pxMinU / texWidth) + pixelOverlapU;
uMax = (pxMaxU / texWidth) - pixelOverlapU;
vMin = (pxMinV / texHeight) + pixelOverlapV;
vMax = (pxMaxV / texHeight) - pixelOverlapV;
}
< /code>
void CSkyBox::Render()
{

STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE);

STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);

STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

STATEMANAGER.SetTexture(1, NULL);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

STATEMANAGER.SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);

STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorld);

static float fOffsetU = 0.0f;
static float fOffsetV = 0.0f;
const float fScrollSpeed = 0.0009f;
float fTime = timeGetTime() / 1000.0f;
fOffsetU = fmod(fTime * fScrollSpeed, 1.0f);
fOffsetV = fmod(fTime * fScrollSpeed, 1.0f);

// Doku transform matrisi oluştur
D3DXMATRIX matTexture;
D3DXMatrixIdentity(&matTexture);
matTexture._31 = fOffsetU;
matTexture._32 = 0.0f;

D3DXMATRIX matOldTexture;
STATEMANAGER.GetTransform(D3DTS_TEXTURE0, &matOldTexture);
STATEMANAGER.SaveTransform(D3DTS_TEXTURE0, &matOldTexture);

STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matTexture);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);

// Render Face
if (m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE)
{
CGraphicImageInstance* pFaceImageInstance = m_GraphicImageInstanceMap[m_Faces[0].m_strFaceTextureFileName];
if (!pFaceImageInstance)
{
TraceError("Skybox Face Texture NULL!");
return;
}
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
STATEMANAGER.SetTexture(0, pFaceImageInstance->GetTextureReference().GetD3DTexture());

for (unsigned int i = 0; i < 6; ++i)
{
if (i == 4) // (+Y)
{
// Animate: off
D3DXMATRIX matIdentity;
D3DXMatrixIdentity(&matIdentity);
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matIdentity);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
}
else
{
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matTexture);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
}
m_Faces.Render();
}

STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSU);
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSV);
}
else
{
for (unsigned int i = 0; i < 6; ++i)
{
m_Faces.Render();
}
}

STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
STATEMANAGER.RestoreTransform(D3DTS_TEXTURE0);

STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING);
STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_FOGENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);

STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
}


Подробнее здесь: https://stackoverflow.com/questions/795 ... h-directx9
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Рисование 2D линий в DirectX9
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • DirectX9-DirectX11 Создание общей текстуры терпит неудачу Sharpdx
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Использование калибровки «рыбий глаз» для решения изображений всего неба с использованием OpenCV (не удалось)
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Точечная диаграмма на участке неба с кругом
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Точечная диаграмма на участке неба с кругом
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»