原文:HLSL像素着色器


昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心

手机淘宝二维码 扫描      

或者打开连接:程序设计开发 ,掌声鼓励,欢迎光临.


 

 

像素着色器替代了固定渲染管线的 多纹理化 阶段(书上说的)

这是片面的,不完善的,  其实像素着色器,只要渲染到屏幕上,那就有像素这个东西,就要有像素着色器.

实现步骤:

1.编写和编译像素着色器文件

2.创建像素着色器

3.设置像素着色器

//文本文件代码

//--------------------------begim ps.txt---------------------------------------
//全局变量
//存储颜色混合的比例值s,其中
//Scalar.x = s
//Scalar.y = 1-s vector Scalar; //纹理混合比例(权重) //纹理0; 纹理1
texture Tex0;
texture Tex1; //纹理采样器0
sampler Samp0 = sampler_state
{
Texture = <Tex0>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
}; //纹理采样器1
sampler Samp1 = sampler_state
{
Texture = <Tex1>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
}; //输入两套纹理坐标
struct PS_INPUT
{
float2 uvCoords0 : TEXCOORD0;
float2 uvCoords1 : TEXCOORD1;
}; //输出像素颜色
struct PS_OUTPUT
{
float4 Color : COLOR0;
}; //入口函数
PS_OUTPUT PS_Main(PS_INPUT input)
{
PS_OUTPUT output = (PS_OUTPUT)0;
//分别对两个纹理进行采样按照比例混合后输出颜色值
output.Color = tex2D(Samp0, input.uvCoords0)*Scalar.x + tex2D(Samp1, input.uvCoords1)*Scalar.y;
return output;
} //--------------------------end ps.txt---------------------------------------

vs程序中源代码:

 

	//setup
void Setup()
{
HRESULT hr = 0;
//创建顶点缓存
m_d3dDevice->GetD3DDevice()->CreateVertexBuffer(
4 * sizeof(MultiTexVertex),
D3DUSAGE_WRITEONLY,
MultiTexVertex::FVF,
D3DPOOL_MANAGED,
&quadVB,
0);
//填充顶点缓存
MultiTexVertex* v = 0;
quadVB->Lock(0, 0, (void**)&v, 0);
v[0] = MultiTexVertex(-3.0f, -3.0f, 10.0f, 0.0f, 1.0f, 0.0f, 1.0f);
v[1] = MultiTexVertex(-3.0f, 3.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f);
v[2] = MultiTexVertex( 3.0f, -3.0f, 10.0f, 1.0f, 1.0f, 1.0f, 1.0f);
v[3] = MultiTexVertex( 3.0f, 3.0f, 10.0f, 1.0f, 0.0f, 1.0f, 0.0f);
quadVB->Unlock(); //加载纹理:
D3DXCreateTextureFromFile(D3DDevice, L"D:\\pic1.png", &quadTexture0);
D3DXCreateTextureFromFile(m_d3dDevice->D3DDevice, L"D:\\pic2.png", &quadTexture1); //编译像素着色器:
//创建像素着色器
ID3DXBuffer* codeBuffer = 0;
ID3DXBuffer* errorBuffer = 0;
hr = D3DXCompileShaderFromFile(
L"D:\\ps.txt",
0,
0,
"PS_Main", // entry point function name
"ps_2_0",
D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY,
&codeBuffer,
&errorBuffer,
&pixelConstTable);
// 输出错误信息:
if (errorBuffer)
{
string str = (char*)errorBuffer->GetBufferPointer();
MessageBox(NULL, Common::StringToWString(str).c_str(), L"ERROR", MB_OK);
//safe_release<ID3DXBuffer*>(error_buffer);
}
if (FAILED(hr))
{
MessageBox(NULL, L"D3DXCreateEffectFromFile() - FAILED", L"ERROR", MB_OK);
} //创建像素着色器
hr = D3DDevice->CreatePixelShader((DWORD*)codeBuffer->GetBufferPointer(), &pixelShader);
if (FAILED(hr))
{
MessageBox(NULL, L"CreateVertexShader - FAILED", L"ERROR", MB_OK);
}
//释放
//safe_release<ID3DXBuffer*>(shader_buffer); //设置投影矩阵
D3DXMATRIX p;
RECT rt;
GetClientRect(Application::GetInstance()->GetWnd(), &rt);
D3DXMatrixPerspectiveFovLH(&p, D3DX_PI * 0.25f, (float)rt.right / rt.bottom, 1.0f, 1000.0f);
D3DDevice->SetTransform(D3DTS_PROJECTION, &p); //禁用灯光
D3DDevice->SetRenderState(D3DRS_LIGHTING, false); //得到各常量句柄
ScalarHandle = pixelConstTable->GetConstantByName(0, "Scalar");
Samp0Handle = pixelConstTable->GetConstantByName(0, "Samp0");
Samp1Handle = pixelConstTable->GetConstantByName(0, "Samp1"); //设置对着色器变量Samp0、Samp1的描述
UINT count;
pixelConstTable->GetConstantDesc(Samp0Handle, &Samp0Desc, &count);
pixelConstTable->GetConstantDesc(Samp1Handle, &Samp1Desc, &count);
//设定各着色器变量为初始值
pixelConstTable->SetDefaults(D3DDevice);
} //display : 设置像素着色器,取用2张纹理,并在渲染前设置对应采样状态
void Display(float timeDelta)
{
// render now
D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
D3DDevice->BeginScene(); //为着色器全局变量Scalar赋值
D3DXVECTOR4 scalar(0.5f, 0.5f, 0.0f, 1.0f);//一半一半混合
pixelConstTable->SetVector(D3DDevice, ScalarHandle, &scalar);
//设置像素着色器
D3DDevice->SetPixelShader(pixelShader); //设置定点格式、绑定数据流
D3DDevice->SetFVF(MultiTexVertex::FVF);
D3DDevice->SetStreamSource(0, quadVB, 0, sizeof(MultiTexVertex));
//设置第一、二层纹理
D3DDevice->SetTexture(Samp0Desc.RegisterIndex, quadTexture0);
D3DDevice->SetTexture(Samp1Desc.RegisterIndex, quadTexture1); //绘制图形
D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); D3DDevice->EndScene();
D3DDevice->Present(NULL, NULL, NULL, NULL);
}

 

 

 

 

代码来自 博客下载:HLSL初级教程.

效果图:纹理1,2:

混合效果:

 

HLSL像素着色器的更多相关文章

  1. WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码

    原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Di ...

  2. D3D三层Texture纹理经像素着色器实现渲染YUV420P

    简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...

  3. DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区

    前言 由于在Direct3D 11中取消了固定管线,要想绘制图形必须要了解可编程渲染管线的流程,一个能绘制出图形的渲染管线最少需要有这两个可编程着色器:顶点着色器和像素着色器. 本章会直接跳过渲染管线 ...

  4. 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但

    片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.

  5. ThreeJS 物理材质shader源码分析(像素着色器)

    再此之前推荐一款GLTF物理材质在线编辑器https://tinygltf.xyz/ 像素着色器(meshphysical_frag.glsl) #define PHYSICAL uniform ve ...

  6. DirectX11 With Windows SDK--26 计算着色器:入门

    前言 现在开始迎来所谓的高级篇了,目前计划是计算着色器部分的内容视项目情况,大概会分3-5章来讲述. DirectX11 With Windows SDK完整目录 Github项目源码 欢迎加入QQ群 ...

  7. Initialize the shader 初始化着色器

    目录 Loads the shader files and makes it usable to DirectX and the GPU 加载着色器文件并使其可用于DirectX和GPU Compil ...

  8. DirectX11 With Windows SDK--15 几何着色器初探

    前言 从这一部分开始,感觉就像是踏入了无人深空一样,在之前初学DX11的时候,这部分内容都是基本上跳过的,现在打算重新认真地把它给拾回来. DirectX11 With Windows SDK完整目录 ...

  9. DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果

    前言 上一章我们知道了如何使用几何着色器将顶点通过流输出阶段输出到绑定的顶点缓冲区.接下来我们继续利用它来实现一些新的效果,在这一章,你将了解: 实现公告板效果 Alpha-To-Coverage 对 ...

随机推荐

  1. Chai.js断言库API中文文档

    基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...

  2. vue-cli3.x正确打包项目,解决静态资源与路由加载无效的问题,history模式下配合使用nginx运行打包后的项目

    使用vue-cli3.x正确打包项目,配合nginx运行打包后的内容 vue.config.js module.exports = { publicPath: './',//打包后的位置(如果不设置这 ...

  3. 20190828 [ Night ] - 弋

    半集训可还行…… 半集训第一次模拟 考试过程 好像是上回的同套题. ××内个$\text{english}$真毒瘤 T1 什么玩意? $chinese$? 前面两句背景是个? 需要$\Theta(1) ...

  4. Web前端开发的就业前景怎么样,薪资待遇如何

    信息技术的迅速发展,使IT技术者们赶上了一个百年难遇的好机会,尤其是国家出台了“互联网+”的政策后,更是催生了IT行业的就业空间,使其呈现爆发性增长. 如今,微信逐渐成为了大家主要的交流工具,随着各种 ...

  5. 数据库--sql语句

    数据库的操作语句总共四大类:增insert into  删delete  改update  查select; 增:INSERT INTO `表名`(`字段名`,`字段名`) `VALUES`('值', ...

  6. Eclipse 出现select type (? = any character,*= any String,Tz=TimeZone)

    在eclipse中想运行project的时候,往往是右键项目名称---->run As --->Java Application 但是会弹出窗口显示select type (? = any ...

  7. Bootstrap启动(关闭)轮播

    $('.carousel').carousel(); //启动轮播 $('.carousel').carousel(‘pause’); //关闭轮播 $(‘.carousel’).carousel({ ...

  8. maven下载安装以及环境配置

    1.到官网下载maven 2.解压到自己想放的安装目录 3.复制maven所在的安装路径,然后右键我的电脑-->属性-->高级系统设置-->环境变量 4.在系统变量中新建,设置变量名 ...

  9. golang之vscode环境配置

    go语言开发,选择vscode作为IDE工具也是一个不错的选择,毕竟goland收费,老是破解也挺麻烦,除了这点,不过说实话挺好用的.vscode的话相对来说就毕竟原始,适合初学者. 1.vscode ...

  10. ScrollView 实现子视图滑动到顶部时固定不动

    这个,个人建议使用自己写的布局使用view的gon或者visble的方法,使用design包中的控件来的话,局限性很大 方法有倆 (1)自定义ScrollView 重写ScrollView 的 com ...