D3D11 Глубина рендеринга Проблема

еще один вопрос о глубине буфера 😉 Я прочитал другие вопросы, которые мне задавали, и просто не могу понять, что я делаю неправильно. По сути, моя проблема — это классическая «последняя прорисовка объектов поверх ранее прорисованных объектов». Но почему?

Я использую D3D11, C ++, следуя некоторым базовым учебникам, и я на полпути через абстрагирование специфичного для объекта кода из моего общего класса рендеринга D3D в отдельный объектный класс. Так что здесь есть куча временного кода, чтобы помочь мне понять, что я могу вставить в свой объектный класс и что нужно для рендеринга каждого кадра на более высоком уровне.

Вот что у меня есть в моей функции рендеринга моего класса D3D (код ниже).

Я чувствую, что упускаю что-то очевидное … Должен ли я использовать отдельный постоянный буфер или указатель буфера для каждого нарисованного объекта, или это что-то еще? Я уже несколько часов бьюсь головой об этом, и это, вероятно, очевидно для кого-то более продвинутого, чем я 😉

void D3DClass::RenderFrame(void)
{
//Create constant buffer object to be passed
CBUFFER cBuffer;
cBuffer.LightVector = XMFLOAT4(-1.0f, 1.0f, 0.0f, 0.0f);
cBuffer.LightColor = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
cBuffer.AmbientColor = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);

CBUFFER cBuffer2;
cBuffer2.LightVector = XMFLOAT4(-1.0f, 1.0f, 0.0f, 0.0f);
cBuffer2.LightColor = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
cBuffer2.AmbientColor = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);

//Matrices for camera and view
XMMATRIX matView, matProjection;

//Camera Object Variables and View Matrix
matView = XMMatrixLookToLH(objCam->Position, objCam->vFwd, objCam->vUp);

//Projection matrix (3d->2d transform on the camera)
matProjection = XMMatrixPerspectiveFovLH(
XMConvertToRadians(45),             // field of view
float(rws1.Width / rws1.Height),    // aspect ratio
0.0001,                             // near view-plane
500.0);                             // far view-plane

//////////////////////
//Per frame updates

//Clear both the back and depth buffers
float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };  //Clear the back buffer to black
devcon->ClearRenderTargetView(backbuffer, clearColor);  //Back buffer
devcon->ClearDepthStencilView(zbuffer, D3D11_CLEAR_DEPTH, 1.0f, 0);  //Depth buffer

//Update constant buffer per frame variables
//devcon->UpdateSubresource(pCBuffer[1], 0, 0, &PerFrame, 0, 0);    // update cbuffer 1/////////////////////
//Per object updates

//OBJECT 1
//Matrices for object scaling, rotation, translation, and the final
XMMATRIX matScale, matRotate, matTranslate, matFinal;

//Update object info (set per object)
objModel1->RotateRightObject(); //TEMP JUST TO GET SOME MOVEMENT
objModel1->RotateVectors();

//Object matrix data (set per object)
matScale = XMMatrixScaling(objModel1->Scale.x, objModel1->Scale.y, objModel1->Scale.z);
matRotate = XMMatrixRotationRollPitchYaw(objModel1->RollPitchYawABS[PITCH], objModel1->RollPitchYawABS[YAW], objModel1->RollPitchYawABS[ROLL]);
matTranslate = XMMatrixTranslationFromVector(objModel1->Position);

//Combined final transforms (set per object)
matFinal = matScale * matRotate * matTranslate * matView * matProjection;  //Load matrices into the constant buffer
cBuffer.Final = matFinal;
cBuffer.Rotation = matRotate;

//Set states  (set per object)
devcon->RSSetState(pRSDefault);                 //Rasterizer state
devcon->PSSetSamplers(0, 1, &pSS[0]);           //Set the sampler state
devcon->OMSetBlendState(pBS, 0, 0xffffffff);    //Set the blend state (for transparency)

//Select which vertex buffer to display (use the object's vertex buffer)
UINT stride = sizeof(VERTEX);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
devcon->IASetIndexBuffer(pIBuffer, DXGI_FORMAT_R32_UINT, 0);

//Select which primtive type we are using
devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

//Draw the object
devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
devcon->PSSetShaderResources(0, 1, &pTexture);
devcon->DrawIndexed(CubeNumTriangles * 3, 0, 0);  //NUMBER OF TRIANGLES * 3 (so it knows how many logical vertices it is making)//OBJECT 2
//Matrices for object scaling, rotation, translation, and the final
XMMATRIX matScale2, matRotate2, matTranslate2, matFinal2;  //scale, rotate, and final are specific to objects

//Update object info (set per object)
objModel2->RotateRightObject(); //TEMP JUST TO GET SOME MOVEMENT
objModel2->RotateVectors();

//Object matrix data (set per object)
matScale2 = XMMatrixScaling(objModel2->Scale.x, objModel2->Scale.y, objModel2->Scale.z);
matRotate2 = XMMatrixRotationRollPitchYaw(objModel2->RollPitchYawABS[PITCH], objModel2->RollPitchYawABS[YAW], objModel2->RollPitchYawABS[ROLL]);
matTranslate2 = XMMatrixTranslationFromVector(objModel2->Position);

//Combined final transforms (set per object)
cBuffer.Final = matScale2 * matRotate2 * matTranslate2 * matView * matProjection;  //Load matrices into the constant buffer
cBuffer.Rotation = matRotate2;

//Set states  (set per object)
devcon->RSSetState(pRSDefault);                 //Rasterizer state
devcon->PSSetSamplers(0, 1, &pSS[0]);           //Set the sampler state
devcon->OMSetBlendState(pBS, 0, 0xffffffff);    //Set the blend state (for transparency)

//Select which vertex buffer to display (use the object's vertex buffer)
stride = sizeof(VERTEX);
offset = 0;
devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
devcon->IASetIndexBuffer(pIBuffer, DXGI_FORMAT_R32_UINT, 0);

//Select which primtive type we are using
devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

//Draw the object
devcon->UpdateSubresource(pCBuffer, 0, 0, &cBuffer, 0, 0);
devcon->PSSetShaderResources(0, 1, &pTexture);
devcon->DrawIndexed(CubeNumTriangles * 3, 0, 0);  //NUMBER OF TRIANGLES * 3 (so it knows how many logical vertices it is making)//Done with updates - switch the back buffer and the front buffer
swapchain->Present(0, 0);
}

Спасибо!!!

1

Решение

Хорошо, я понял это — и это была действительно глупая ошибка — мне просто нужно было обновить цель рендеринга этапа вывода-слияния (изначально она была установлена ​​в ноль, прежде чем у меня было включено тестирование глубины). Поэтому следующая функция просто нуждается в обновлении, чтобы включить мой буфер глубины в качестве 3-го параметра:

//Set the render target
devcon->OMSetRenderTargets(1, &backbuffer, zbuffer);

Не могу поверить, что я пропустил это (а затем потратил почти целый день, пытаясь решить это!).

1

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector