2015-02-02 3 views
1

еще один вопрос с буфером глубины ;-) Я читал другие, которые были заданы, и просто не могу понять, что я делаю неправильно. В основном моя проблема - это классический «рендеринг последних обращенных объектов поверх ранее нарисованных объектов». Но почему?D3D11 Depth Rendering Issue

Я использую 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

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

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

не могу поверить, что я пропустил это.