初学DX,比较弱,希望大牛们给些指点。 ^_^
我简单些说,基本上我希望实现的一个技术过程是在程序中手动创建纹理并手动赋值,然后将纹理传入GPU中,在像素着色器上进行采样,然后依据手动写入的颜色值绘制颜色。
在窗口部分我是使用了2个三角形构成一个覆盖全绘图区域的四边形,然后在像素着色器中对传入的纹理进行采样,纹理大小与绘图区域的大小是同样的。
理论上,我希望得到如下的绘制效果。
可是实际上得到了如下的效果。
不知道实际上图片下面那部分颜色数据为何不对,我把核心部分的测试代码贴出来,大家帮我看看吧。//首先是设置数据,这里主要就是创建纹理,手动写颜色,现在期望是全部固定写了蓝色,
//然后建立2个三角形可以拼成一个覆盖整个屏幕的四边形
//最后是将创建的纹理设置进GPU中。
bool Setup()
{
//创建纹理
if (FAILED(Device->CreateTexture(200, 200, 1, D3DUSAGE_DYNAMIC, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &Texture, NULL)))
{
return false;
}
D3DLOCKED_RECT rect;
//加锁
if(FAILED(Texture->LockRect(0, &rect, NULL, NULL)))
{
return false;
}
//写数据进纹理
D3DXVECTOR4 *pData = (D3DXVECTOR4*)rect.pBits;
for (unsigned int x = 0; x < 40000; x++)
{
pData[x] = D3DXVECTOR4(0, 0, 1.0f, 1.0f);
}
//解锁
if (FAILED(Texture->UnlockRect(0)))
{
return false;
} //用4个顶点创建3个三角形,将整个绘图区域覆盖
CUSTEMVERTEX vertices[] =
{
{ 0.0f, 0.0f, 0.3f, 1.0f, 0xffff0000, 0, 0},
{ 200.0f, 0.0f, 0.3f, 1.0f, 0xffff0000, 1, 0},
{ 0.0f, 200.0f, 0.3f, 1.0f, 0xffff0000, 0, 1},
{ 200.0f, 200.0f, 0.3f, 1.0f, 0xffff0000, 1, 1},
};
if(FAILED(Device->CreateVertexBuffer(4 * sizeof(CUSTEMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &Vertex, NULL)))
{
return false;
}
VOID* pVertices;
if(FAILED(Vertex->Lock(0, sizeof(vertices), (void**)&pVertices, 0)))
{
return false;
}
memcpy(pVertices, vertices, sizeof(vertices));
Vertex->Unlock(); //HLSL
DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE | D3DXSHADER_DEBUG;
ID3DXBuffer *poError = NULL;
if(FAILED( D3DXCreateEffectFromFile( Device, _T("TestShader.fx"), NULL, NULL, dwShaderFlags, NULL, &Effect, &poError)))
{
const char *pError = (const char *)poError->GetBufferPointer();
return false;
} //将纹理设置到GPU中,供像素着色器采样。
if(FAILED(Effect->SetTexture("g_Tex", Texture)))
{
return false;
}
return true;
}
//这里就是单纯地在Shader中画像素了
bool Render(float timeDelta)
{
if(Device)
{
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
Device->BeginScene();
Device->SetStreamSource(0, Vertex, 0, sizeof(CUSTEMVERTEX));
Device->SetFVF(D3DFVF_CUSTOMVERTEX); //选择指定的Technique
Effect->SetTechnique("RenderTest");
unsigned int uPass;
if (SUCCEEDED(Effect->Begin(&uPass, 0)))
{
for (unsigned int uP = 0; uP < uPass; uP++)
{
Effect->BeginPass(uP);
//单纯地画2个三角形,构成一个覆盖绘图区域的矩形
Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
Effect->EndPass();
}
Effect->End();
}
Device->EndScene();
Device->Present(0, 0, 0, 0);
}
return true;
}
//下面是Shader代码
texture g_Tex; //纹理
sampler2D g_samTex = sampler_state{
Texture = <g_Tex>;
MinFilter = Point;
MagFilter = Linear;
MipFilter = Linear;
};//顶点着色的输入输出结构
struct RenderTest_Vert_Input
{
float2 Tex : TEXCOORD0;
float4 Color : COLOR;
float4 Position : POSITION;
};
struct RenderTest_Vert_Output
{
float4 Position : POSITION;
float4 Color : COLOR;
float2 Tex : TEXCOORD0;
};
//顶点着色函数
RenderTest_Vert_Output RenderTest_Vert(RenderTest_Vert_Input Input)
{
RenderTest_Vert_Output Output;
Output.Position = Input.Position;
Output.Tex = Input.Tex;
Output.Color = Input.Color;
return Output;
}
//像素着色的输入输出结构
struct RenderTest_Pix_Input
{
float4 Color : COLOR;
float2 Tex : TEXCOORD0;
};
struct RenderTest_Pix_Output
{
float4 Color : COLOR;
};
//像素着色函数
RenderTest_Pix_Output RenderTest_Pix(RenderTest_Pix_Input Input)
{
RenderTest_Pix_Output Output;
Output.Color = tex2D(g_samTex, Input.Tex);
return Output;
}
//供调用的technique
technique RenderTest
{
pass p0
{
VertexShader = compile vs_2_0 RenderTest_Vert();
PixelShader = compile ps_3_0 RenderTest_Pix();
}
}
我简单些说,基本上我希望实现的一个技术过程是在程序中手动创建纹理并手动赋值,然后将纹理传入GPU中,在像素着色器上进行采样,然后依据手动写入的颜色值绘制颜色。
在窗口部分我是使用了2个三角形构成一个覆盖全绘图区域的四边形,然后在像素着色器中对传入的纹理进行采样,纹理大小与绘图区域的大小是同样的。
理论上,我希望得到如下的绘制效果。
可是实际上得到了如下的效果。
不知道实际上图片下面那部分颜色数据为何不对,我把核心部分的测试代码贴出来,大家帮我看看吧。//首先是设置数据,这里主要就是创建纹理,手动写颜色,现在期望是全部固定写了蓝色,
//然后建立2个三角形可以拼成一个覆盖整个屏幕的四边形
//最后是将创建的纹理设置进GPU中。
bool Setup()
{
//创建纹理
if (FAILED(Device->CreateTexture(200, 200, 1, D3DUSAGE_DYNAMIC, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &Texture, NULL)))
{
return false;
}
D3DLOCKED_RECT rect;
//加锁
if(FAILED(Texture->LockRect(0, &rect, NULL, NULL)))
{
return false;
}
//写数据进纹理
D3DXVECTOR4 *pData = (D3DXVECTOR4*)rect.pBits;
for (unsigned int x = 0; x < 40000; x++)
{
pData[x] = D3DXVECTOR4(0, 0, 1.0f, 1.0f);
}
//解锁
if (FAILED(Texture->UnlockRect(0)))
{
return false;
} //用4个顶点创建3个三角形,将整个绘图区域覆盖
CUSTEMVERTEX vertices[] =
{
{ 0.0f, 0.0f, 0.3f, 1.0f, 0xffff0000, 0, 0},
{ 200.0f, 0.0f, 0.3f, 1.0f, 0xffff0000, 1, 0},
{ 0.0f, 200.0f, 0.3f, 1.0f, 0xffff0000, 0, 1},
{ 200.0f, 200.0f, 0.3f, 1.0f, 0xffff0000, 1, 1},
};
if(FAILED(Device->CreateVertexBuffer(4 * sizeof(CUSTEMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &Vertex, NULL)))
{
return false;
}
VOID* pVertices;
if(FAILED(Vertex->Lock(0, sizeof(vertices), (void**)&pVertices, 0)))
{
return false;
}
memcpy(pVertices, vertices, sizeof(vertices));
Vertex->Unlock(); //HLSL
DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE | D3DXSHADER_DEBUG;
ID3DXBuffer *poError = NULL;
if(FAILED( D3DXCreateEffectFromFile( Device, _T("TestShader.fx"), NULL, NULL, dwShaderFlags, NULL, &Effect, &poError)))
{
const char *pError = (const char *)poError->GetBufferPointer();
return false;
} //将纹理设置到GPU中,供像素着色器采样。
if(FAILED(Effect->SetTexture("g_Tex", Texture)))
{
return false;
}
return true;
}
//这里就是单纯地在Shader中画像素了
bool Render(float timeDelta)
{
if(Device)
{
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
Device->BeginScene();
Device->SetStreamSource(0, Vertex, 0, sizeof(CUSTEMVERTEX));
Device->SetFVF(D3DFVF_CUSTOMVERTEX); //选择指定的Technique
Effect->SetTechnique("RenderTest");
unsigned int uPass;
if (SUCCEEDED(Effect->Begin(&uPass, 0)))
{
for (unsigned int uP = 0; uP < uPass; uP++)
{
Effect->BeginPass(uP);
//单纯地画2个三角形,构成一个覆盖绘图区域的矩形
Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
Effect->EndPass();
}
Effect->End();
}
Device->EndScene();
Device->Present(0, 0, 0, 0);
}
return true;
}
//下面是Shader代码
texture g_Tex; //纹理
sampler2D g_samTex = sampler_state{
Texture = <g_Tex>;
MinFilter = Point;
MagFilter = Linear;
MipFilter = Linear;
};//顶点着色的输入输出结构
struct RenderTest_Vert_Input
{
float2 Tex : TEXCOORD0;
float4 Color : COLOR;
float4 Position : POSITION;
};
struct RenderTest_Vert_Output
{
float4 Position : POSITION;
float4 Color : COLOR;
float2 Tex : TEXCOORD0;
};
//顶点着色函数
RenderTest_Vert_Output RenderTest_Vert(RenderTest_Vert_Input Input)
{
RenderTest_Vert_Output Output;
Output.Position = Input.Position;
Output.Tex = Input.Tex;
Output.Color = Input.Color;
return Output;
}
//像素着色的输入输出结构
struct RenderTest_Pix_Input
{
float4 Color : COLOR;
float2 Tex : TEXCOORD0;
};
struct RenderTest_Pix_Output
{
float4 Color : COLOR;
};
//像素着色函数
RenderTest_Pix_Output RenderTest_Pix(RenderTest_Pix_Input Input)
{
RenderTest_Pix_Output Output;
Output.Color = tex2D(g_samTex, Input.Tex);
return Output;
}
//供调用的technique
technique RenderTest
{
pass p0
{
VertexShader = compile vs_2_0 RenderTest_Vert();
PixelShader = compile ps_3_0 RenderTest_Pix();
}
}
解决方案 »
- 父窗口如何捕获子窗口内的鼠标弹起事件
- 在一个对话框中,想一直到一个具体控件是否在焦点状态怎么写代码?
- 菜鸟编译开源putty遇到的vc问题
- 通信上了接收不到数据!
- 大家看看我的第一个windows应用程序哪里错了?
- 从CWnd派生一个窗口,并且显示(显示为弹出窗口或显示为一个窗口的子窗口,正确的做法是怎样,为什么我写的总断言失败呢?
- 送分了,送分了,看看这段代码错在那里,我想不通(关于随机数产生器的问题)
- 如何给修改后的入口函数传递参数?
- vc用什么软件制作安装程序最好?
- CObjArray和CObjList的语义差别?
- vs2008 安装了SP1,给新建对话框添加类后编译出错
- [求助][ODBC]向ACCESS中添加记录时候不能更新
第二张,实际的效果: