HLSL像素着色器

原文: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:

混合效果:

?

原文地址:https://www.cnblogs.com/lonelyxmas/p/10807302.html

时间: 2024-10-24 08:26:24

HLSL像素着色器的相关文章

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

原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Direct3D 着色器模型所必须的语言.WPF 支持 Direct3D 9,也支持使用 HLSL 来编写着色器.你可以使用任何一款编辑器来编写 HLSL,但 Shazzam Shader Editor 则是专门为 WPF 实现像素着色器而设计的一款编辑器,使用它来编写像素着色器,可以省去像素着色器接入

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

简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Texture纹理似乎不支持直接渲染YUV420P.表面(surface)用法似乎比较单一,通常用来显示数据,用Texture的话就可以用上D3D的许多其他功能,做出一些效果.当然,这看个人需求,通常而言显示视频数据用表面就够了. 1.利用像素着色器把YUV420P数据转为RGB32 视频播放过程中帧与

Direct2D 1.1 开发笔记 特效篇(三) 简单的像素着色器特效

(转载请注明出处) 这次我们实现一个自定义的转变. 实现Direct2D 自定义转变Shader Models需要HLSL(High Level Shading Language)的实现. HLSL是Shader的一种实现,但是HLSL只能在D3D中使用,所以有点蛋疼. Shader被描述为显卡执行的小段程序,能够高效(并行)地执行. 没学过?没关系,笔者也没有,但是详细的不会在这里说明(你TM逗我(╯‵□′)╯︵┴─┴),请到官网中看看. D2D 特效能用 HLSL 的  4.0 及其以上版本

Directx 中HLSL高级着色器语言 脑补一下吧

HLSL初级教程 作者:trcj 目录 前言 1.HLSL入门 1.1什么是着色器 1.2什么是HLSL 1.3怎么写HLSL着色器 1.4怎么用HLSL着色器 2.顶点着色器 2.1可编程数据流模型 2.2顶点声明 2.3用顶点着色器实现渐变动画 3.像素着色器 3.1多纹理化 3.2多纹理效果的像素着色器 3.3应用程序 4.HLSL Effect(效果框架) 4.1Effect代码结构 4.2用Effect实现多纹理化效果 结语 参考资料 前言 本教程针对HLSL(High Level S

unity shader 学习 (2)Vs【顶点着色器】 和 Ps【像素着色器】

上一章我写了渲染管线,中间提到了shader的作用,我们的大shader同学主要就是负责被CPU指派到GPU中做一些如顶点转换,关照模型,光栅化等操作的. 大shader有两种类型,他们分别是Vs[顶点着色器] 和 Ps[像素着色器].. 他们可以同时存在,也可以分开存在,没有任何使用限制. 当时如果同时存在的话,必须Vs执行完成后再交给Ps处理. 他们两个家伙是配合固定流程管线而存在的.

HLSL 像色着色器ps_2_0运行没问题,ps_3_0运行有问题

最近开发中用到了像素着色器,我写了一个文本数据用 D3DXCompileShaderFromFile 对其进行编译,当我设置为 ps_2_0 时一切正常. 因程序需要编写更多的分支语句,而ps_2_0的指令数等受限,因此我想改为 ps_3_0 版本编译,编译正常[我对硬件进行了测试,它是支持 ps_3_0的]. 运行时发现:ps_2_0 图像显示正确:使用ps_3_0 时,图像显示错误,为一张同色的背景图. 解决该问题的方式: ps_3_0 needing a vertex shader .即p

GPU渲染管线与可编程着色器

本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/71978861 这篇文章是解析计算机图形学界"九阴真经总纲"一般存在的<Real-Time Rendering 3rd>系列文章的第三篇.将带来RTR3第三章内容"Chapter 3 The Graphics Processing Unit 图形处理器"的总结.概括与提炼. 这章的主要内容是介绍G

Shader开发之三大着色器

固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分. Shader "Custom/VertexList" { Properties { _Color("Main Color",Color) = (0,1,1,0.5) _SpecColor("Spec Color",Color) = (1,1,1,1) _Emission

(转载)(官方)UE4--图像编程----着色器开发

着色器开发 快速入门 处理着色器时,请务必将 r.ShaderDevelopmentMode 设置为 1,以将其启用.最简单的方法是编辑 ConsoleVariables.ini,以便每次加载时都进行启用.这将启用"出错时重试"以及与着色器开发相关的日志和警告. 将更改保存到 .usf 文件之后,使用 Ctrl+Shift+. 可重新编译已更改的着色器. 如果您更改包括在许多着色器中的文件(例如,common.usf),那么此操作可能需要花费一些时间.如果您想对某个材质进行迭代,那么可