新学D3D,调函数画个茶壶,似乎有点问题

BORLANDSUN 2011-09-27 12:31:18
用D3DXCreateTeapot()画个茶壶,之后做旋转时发现,即使茶壶盖转到下面,依然能透过茶壶身子看到它,
d3ddp.EnableAutoDepthStencil = TRUE;
d3ddp.AutoDepthStencilFormat = D3DFMT_D16;
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
这几句都加了,依然不起作用。(不加时连壶嘴转到背面都能看到,加后壶嘴看不到,壶盖依然可见)。
求解。另:OpenGL画茶壶没有出现这种情况。
...全文
410 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
努力的我 2013-07-03
  • 打赏
  • 举报
回复
.....老大忘了开深度测试了吧
SuleMate 2011-09-30
  • 打赏
  • 举报
回复
d3ddp.BackBufferFormat = D3DFMT_UNKNOWN;
d3ddp.EnableAutoDepthStencil = TRUE;
d3ddp.AutoDepthStencilFormat = D3DFMT_D16;
这里有问题

void Render(void)
{
g_teapot->DrawSubset(0);
}
子集画4次

晚上空了帮你看看
BORLANDSUN 2011-09-28
  • 打赏
  • 举报
回复
不是透明度,因为其它部分的确是遮挡了,但唯有壶盖子能看到。代码很简单,我帖出来。编译时需要DX9 SDK的支持,搞过的同志们肯定知道。
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include "mmsystem.h"
#include "d3dx9.h" // 修改:在Project->Options->C++ Compiler->Path and Defines中的Defines中添加“sqrtf=sqrt”
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPD3DXMESH g_teapot = NULL;

void InitGeometry(void);
void SetupMatrics(float XAngle);
void SetupLight(void);
void Render(void);

int gAngle;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// 初始化D3D9环境
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3ddp;
ZeroMemory(&d3ddp, sizeof(D3DPRESENT_PARAMETERS));
d3ddp.Windowed = TRUE;
d3ddp.SwapEffect = D3DSWAPEFFECT_DISCARD;
//d3ddp.BackBufferFormat = D3DFMT_UNKNOWN;
d3ddp.EnableAutoDepthStencil = TRUE;
d3ddp.AutoDepthStencilFormat = D3DFMT_D16;

g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, this->Handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3ddp, &g_pd3dDevice);

//g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
//g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
//g_pd3dDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);



InitGeometry();

SetupLight();
gAngle = 0;
}
//---------------------------------------------------------------------------

void InitGeometry(void)
{
D3DXCreateTeapot(g_pd3dDevice, &g_teapot, NULL);
//D3DXCreateBox(g_pd3dDevice, 2, 2, 2, &g_teapot, NULL);
//D3DXCreateSphere(g_pd3dDevice, 1, 20, 20, &g_teapot, NULL);
//D3DXCreateTorus(g_pd3dDevice, 0.5f, 1.2f, 50, 50, &g_teapot, NULL);
}
//---------------------------------------------------------------------------

void SetupMatrics(float Angle)
{
// 世界矩阵
D3DXMATRIXA16 matWorld;
D3DXMatrixRotationX(&matWorld, Angle);
//D3DXMatrixRotationY(&matWorld, Angle);
//D3DXMatrixRotationZ(&matWorld, Angle);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

// 观察矩阵
D3DXVECTOR3 vEyePt(0.0, 3.0, -5.0);

D3DXVECTOR3 vLookatPt(0.0, 0.0, 0.0);
D3DXVECTOR3 vUpVec(0.0, 1.0, 0.0);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);

// 透视投影矩阵
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4.0, 1.0, 0.0, 100.0);
//D3DXMatrixOrthoLH(&matProj, 10, 10, -100, 100);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);

// 视区
D3DVIEWPORT9 vp;
vp.X = 0;
vp.Y = 0;
vp.Width = Form1->Width;
vp.Height = Form1->Height;
vp.MinZ = 0;
vp.MaxZ = 1;
g_pd3dDevice->SetViewport(&vp);
}
//---------------------------------------------------------------------------

void SetupLight(void)
{
// 设置材质
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl, sizeof(D3DMATERIAL9));
mtrl.Diffuse.r = 1.0f;
mtrl.Diffuse.g = 0.8f;
mtrl.Diffuse.b = 0.7f;
mtrl.Diffuse.a = 1.0f;
mtrl.Ambient.r = 0.0f;
mtrl.Ambient.g = 0.8f;
mtrl.Ambient.b = 0.7f;
mtrl.Ambient.a = 1.0f;/**/
g_pd3dDevice->SetMaterial(&mtrl);

// 设置光源
D3DXVECTOR3 vecDir;
D3DLIGHT9 light;
ZeroMemory(&light, sizeof(D3DLIGHT9));
light.Type = D3DLIGHT_DIRECTIONAL;

light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
vecDir = D3DXVECTOR3(1, 1, 1);
D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction, &vecDir);
light.Range = 1000.0f;
HRESULT hr = g_pd3dDevice->SetLight(0, &light);
g_pd3dDevice->LightEnable(0, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);/**/

D3DXVECTOR3 vecPos2;
D3DLIGHT9 light2;
ZeroMemory(&light2, sizeof(D3DLIGHT9));
light2.Type = D3DLIGHT_POINT;
light2.Diffuse.r = 0.9f;
light2.Diffuse.g = 0.0f;
light2.Diffuse.b = 0.0f;
light2.Position = D3DXVECTOR3(3, 2, 1);
light2.Range = 100.0f;
light2.Attenuation0 = 1.0f;
//g_pd3dDevice->SetLight(1, &light2);
//g_pd3dDevice->LightEnable(1, TRUE);
//g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);

// 设置环境光
//g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
}
//---------------------------------------------------------------------------

void Render(void)
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(128, 128, 128), 1.0, 0);
g_pd3dDevice->BeginScene();


gAngle++;
SetupMatrics(gAngle*D3DX_PI/180.0);

g_teapot->DrawSubset(0);

g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Render();
Caption = gAngle;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
g_teapot->Release();
g_pd3dDevice->Release();
g_pD3D->Release();
}
//---------------------------------------------------------------------------


SuleMate 2011-09-28
  • 打赏
  • 举报
回复
透明度问题么?现在做软件~~~很长时间没搞D3D 记不住了
设置颜色的时候第4个参数就是透明度吧
asong200 2011-09-27
  • 打赏
  • 举报
回复
有意思,但是偶没有搞过。关注。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧