我用DX9使用頂點緩衝區(DrawPrimitive)渲染2D精靈。 一些動畫獲得了不同大小的不同紋理文件。dx紋理不會按時更改?
現在我得到以下問題:在兩個具有不同紋理文件的動畫之間切換的單幀上(例如,當開始走路或完成走路並開始站立時),它將以座標新的紋理,但仍呈現舊紋理。這看起來好像我沒有爲新動畫設置紋理。唯一的問題是 - 我做到了。
我如何理解問題:我在該框架上截取了一個截圖,並注意到它渲染了一個紋理,其座標與其他紋理貼合。
在我的渲染函數中,我首先獲取新紋理並將其發送到DX,而不是計算座標,最後我使用座標和新紋理集渲染我的頂點。我檢查並調試了數百萬次,所有的值都是正確的,但是卻發生了錯誤。
任何想法,爲什麼會發生這種情況?
謝謝!
編輯:當你說 「座標爲新的紋理」,你reffering這個
// Render a quad using the vertex buffer
void CGraphicsManager::RenderQuadViaVertexBuffer(const SVertex* pVertices) const
{
// Increase renders count
this->m_RenderCount++;
// vb_vertices now points to our vertices inside the Vertex buffer, so
// to fill in our VB, we copy to vb_vertices.
memcpy(this->m_pVertexBufferBuffPtr + this->m_OffsetInVertexBuffer, pVertices, sizeof(SVertex) * (VERTICES_IN_QUAD));
// Render the rectanlge using the vertices we got.
this->m_pD3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, this->m_OffsetInVertexBuffer, PRIMITIVES_IN_QUAD);
// Increment the offset in the vertex buffer
this->m_OffsetInVertexBuffer += VERTICES_IN_QUAD;
}
// Render a quad
void CGraphicsManager::Render(const STexture& p_Texture, SLocation p_RenderLocation, SSize p_RenderSize, const SQuad& p_TextureQuad, SfColor p_RenderColor, ERenderEffects p_RenderEffect) const
{
// Set render effect
this->SetRenderEffect(p_RenderEffect);
// Set texture
this->SetTexture(p_Texture);
// Set the vertex needed for the rendering
VerticesForQuadRender[0].Position.x = p_RenderLocation.x;
VerticesForQuadRender[0].Position.y = p_RenderLocation.y;
VerticesForQuadRender[0].Position.z = 0.0f;
VerticesForQuadRender[0].color = p_RenderColor;
VerticesForQuadRender[0].tv = p_TextureQuad.left;
VerticesForQuadRender[0].tu = p_TextureQuad.top;
VerticesForQuadRender[1].Position.x = p_RenderLocation.x + p_RenderSize.x;
VerticesForQuadRender[1].Position.y = p_RenderLocation.y;
VerticesForQuadRender[1].Position.z = 0.0f;
VerticesForQuadRender[1].color = p_RenderColor;
VerticesForQuadRender[1].tv = p_TextureQuad.right;
VerticesForQuadRender[1].tu = p_TextureQuad.top;
VerticesForQuadRender[2].Position.x = p_RenderLocation.x;
VerticesForQuadRender[2].Position.y = p_RenderLocation.y + p_RenderSize.y;
VerticesForQuadRender[2].Position.z = 0.0f;
VerticesForQuadRender[2].color = p_RenderColor;
VerticesForQuadRender[2].tv = p_TextureQuad.left;
VerticesForQuadRender[2].tu = p_TextureQuad.bottom;
VerticesForQuadRender[3].Position.x = p_RenderLocation.x + p_RenderSize.x;
VerticesForQuadRender[3].Position.y = p_RenderLocation.y + p_RenderSize.y;
VerticesForQuadRender[3].Position.z = 0.0f;
VerticesForQuadRender[3].color = p_RenderColor;
VerticesForQuadRender[3].tv = p_TextureQuad.right;
VerticesForQuadRender[3].tu = p_TextureQuad.bottom;
this->RenderQuadViaVertexBuffer(VerticesForQuadRender);
}
// Starts a rendering frame
bool CGraphicsManager::StartFrame()
{
// Clear texture
this->ClearTexture();
// Zero renders count
this->m_RenderCount = 0;
// Clear screen
if (!this->ClearScreen())
{
this->ResetDevice();
return false;
}
// Begin new rendering scene
if (FAILED(this->m_pD3dDevice->BeginScene()))
{
this->ResetDevice();
return false;
}
// Set render from our vertex buffer
this->BeginRenderFromVertexBuffer();
return true;
}
// Finish rendering
bool CGraphicsManager::EndFrame()
{
// Unlock vertex buffer
this->m_pVertexBuffer->Unlock();
// Notify the device that we're finished rendering for this frame
if (FAILED(this->m_pD3dDevice->EndScene()))
{
this->ResetDevice();
return false;
}
// Present scene
if(FAILED(this->m_pD3dDevice->Present(NULL, //Source rectangle to display, NULL for all of it
NULL, //Destination rectangle, NULL to fill whole display
NULL, //Target window, if NULL uses device window set in CreateDevice
NULL))) //Dirty Region, set it to NULL
{
this->ResetDevice();
return false;
}
// Finish rendering
return true;
}
// This function must be called before rendering textured surfaces
void CGraphicsManager::BeginRenderFromVertexBuffer() const
{
// Lock the vertex buffer (unlock on release) and get the pointer to the begining of the buffer
HRESULT hr = this->m_pVertexBuffer->Lock
(0, // Offset, we want to start at the beginning
0, //SizeToLock, 0 means lock the whole thing
(void**)&this->m_pVertexBufferBuffPtr, //If successful, this will point to the data in the vertex buffer
0);
ASSERT(SUCCEEDED(hr), "Failed to lock vertex buffer! (err: " << hr << ")");
// Set offset in vertex buffer back to 0
this->m_OffsetInVertexBuffer = 0;
}
添加SetRenderEffect和SetTexture的代碼。 – Goz