d3d透视逆向篇:第10课 D3D 透视NumVertices等参数筛选

本文是关于D3D透视的逆向教程,主要讲解如何利用NumVertices参数筛选并绘制3D游戏模型,适用于理解d3d自瞄和逆向技术。教程旨在合法范围内分享知识,不涉及非法用途。
摘要由CSDN通过智能技术生成

本逆向安全章节是我业余之间编写的,也借鉴了前辈的经验来给大家做一个简单的文字逆向安全教程,欢迎大家讨论和指正,共同学习。禁止非法用途。教程我从最简单的开始给大家做一个简单的讲解d3d 类的3d游戏和fps游戏黑屏、透视等功能。后面有更多的经验分享给大家。

根据参数NumVertices进行筛选绘图模型。

DrawIndexedPrimitive( D3DPT_TRIANGLELIST, // PrimitiveType
                    50,                 // BaseVertexIndex
                    0,                  // MinIndex
                    4,                  // NumVertices
                    3,                  // StartIndex
                    1 );                // PrimitiveCount
D3DPT_TRIANGLELIST   绘图种类
50,BaseVertextIndex 这是基于 Vertex Buffer(顶点缓冲区)的索引的起始位置
0,MinIndex 这是基于Index Buffer的位置,本次绘制的最小索引
4,NumVertices 表示涉及到(或者说此次绘制要用到的)一块连续的Verte uffer(顶点缓冲区)的数量
在 D3D12 中,渲染超大图片可以使用纹理切割技术,将大型纹理分成多个小型纹理,并将它们分别加载到显存中。然后,在渲染时,可以使用纹理数组来绘制超过功能级别最大纹理大小的图片。 下面是使用纹理切割渲染超大图片的代码示例: ```c++ // 定义纹理大小 const UINT textureWidth = 4096; const UINT textureHeight = 4096; // 加载大型纹理 ComPtr<ID3D12Resource> textureResource; ThrowIfFailed(CreateTextureFromFile(device, commandList, L"large_texture.png", textureResource.GetAddressOf())); // 创建小型纹理 const UINT subTextureWidth = 512; const UINT subTextureHeight = 512; for (UINT y = 0; y < textureHeight; y += subTextureHeight) { for (UINT x = 0; x < textureWidth; x += subTextureWidth) { // 计算子纹理的大小和位置 const UINT subTextureX = x; const UINT subTextureY = y; const UINT subTextureW = min(subTextureWidth, textureWidth - x); const UINT subTextureH = min(subTextureHeight, textureHeight - y); // 创建子纹理资源 ComPtr<ID3D12Resource> subTextureResource; ThrowIfFailed(device->CreateCommittedResource(..., D3D12_RESOURCE_STATE_COPY_DEST, ...)); // 将大型纹理的子区域复制到小型纹理中 D3D12_TEXTURE_COPY_LOCATION srcLocation = CD3DX12_TEXTURE_COPY_LOCATION(textureResource.Get(), subTextureX, subTextureY, 0); D3D12_TEXTURE_COPY_LOCATION dstLocation = CD3DX12_TEXTURE_COPY_LOCATION(subTextureResource.Get(), 0, 0, 0); commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); // 添加小型纹理到纹理数组中 m_textureArray.push_back(subTextureResource); } } // 绑定纹理数组到着色器资源视图 CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle(m_srvDescriptorHeap->GetCPUDescriptorHandleForHeapStart()); for (UINT i = 0; i < m_textureArray.size(); i++) { device->CreateShaderResourceView(m_textureArray[i].Get(), nullptr, srvHandle); srvHandle.Offset(m_srvDescriptorSize); } // 绘制超大图片 const UINT numVertices = 4; const UINT vertexBufferSize = sizeof(Vertex) * numVertices; Vertex quadVertices[] = { { { -1.0f, 1.0f, 0.0f }, { 0.0f, 0.0f } }, { { 1.0f, 1.0f, 0.0f }, { 1.0f, 0.0f } }, { { -1.0f, -1.0f, 0.0f }, { 0.0f, 1.0f } }, { { 1.0f, -1.0f, 0.0f }, { 1.0f, 1.0f } } }; ComPtr<ID3D12Resource> vertexBuffer; ThrowIfFailed(device->CreateCommittedResource(..., D3D12_RESOURCE_STATE_COPY_DEST, ...)); ComPtr<ID3D12Resource> vertexUploadBuffer; ThrowIfFailed(device->CreateCommittedResource(..., D3D12_RESOURCE_STATE_GENERIC_READ, ...)); D3D12_SUBRESOURCE_DATA vertexData = {}; vertexData.pData = reinterpret_cast<BYTE*>(quadVertices); vertexData.RowPitch = vertexBufferSize; vertexData.SlicePitch = vertexBufferSize; UpdateSubresources(commandList, vertexBuffer.Get(), vertexUploadBuffer.Get(), 0, 0, 1, &vertexData); commandList->ResourceBarrier(..., D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER, ...); commandList->IASetVertexBuffers(...); commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); CD3DX12_GPU_DESCRIPTOR_HANDLE srvGpuHandle(m_srvDescriptorHeap->GetGPUDescriptorHandleForHeapStart()); commandList->SetGraphicsRootDescriptorTable(0, srvGpuHandle); commandList->DrawInstanced(numVertices, 1, 0, 0); // 清理资源 m_textureArray.clear(); ``` 在这个示例中,我们首先加载大型纹理,然后将其分成多个小型纹理。然后,我们将每个小型纹理复制到单独的资源中,并将它们添加到纹理数组中。最终,我们绑定纹理数组到着色器资源视图中,并使用它来绘制超过功能级别最大纹理大小的图片。 需要注意的是,纹理切割技术会增加额外的资源开销和绘制开销,因此应该尽可能地避免使用超过功能级别最大纹理大小的图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值