Ⅰ 顶点着色器传递给片段着色器的值老被插值改变,怎么解决

应该把pos.x乘pos.x的代码从顶点着色器转到片段着色器
比如顶点是3个点(1,0),(-1,0),(1,1)
然后顶点着色器只会计算一次该点的坐标,比如x*x则计算出的是(1,0),(1,0),(1,1),那顶点最终计算出的该顶点的坐标就是(1,0),(1,0),(1,1),你先平了方,再传到段着色器,因为3个点x都是1,线性插值后片段的x都是1
但是如果你先把pos先传到片段着色器,再平方,那片段着色器处理的是(1,0),(1,0),(1,1)平均后的坐标再平方,那就是正确的了
顶点只会计算3次,片段是每个像素都会计算一次,所以你在顶点计算的cos,是那个点坐标的cos,不是片段的坐标的cos

Ⅱ unity3d中 如何用js代码来更改shader中的3个子着色器

用SetColor()函数
具体看官方脚本手册的Material类
例子是:
function
Start
()
{
//设置glossy着色器以便使用高光颜色
renderer.material.shader
=
Shader.Find
("
Glossy");
//设置高光色为红色
renderer.material.SetColor
("_SpecColor",
Color.red
);
}

Ⅲ opengl 着色器 有什么用

这是可编程管线里的术语 着色器分为 顶点和像素 两种 也叫 vertex shader 和 fragment shader(或pixel shader),就是可编程管线里两种代码的称呼.用shader可以完成你的各种3d模型,图片显示需要.

Ⅳ 电脑常识:着色器的像素和条数的定义是

像素着色器包含由ASCII文本组成的像素着色器指令。算术指令可以用来进行漫反射和/或镜面反射光照计算。纹理寻址指令提供了多种读取和应用纹理数据的操作。着色器具有这样的功能,可以给颜色分量设置掩码以及交换颜色分量。着色器的正文看起来有点像汇编语言,它用Direct3D扩展(D3DX)进行汇编,输入可以是文本字符串或是文件。汇编器的输出是一系列操作码,应用程序可以通过IDirect3DDevice9::CreatePixelShader方法把这些操作码提供给Direct3D。 本示例用像素着色器对一个四边形的漫反射色进行高洛德插值。示例显示了着色器文件的内容以及应用程序中所需的代码。 着色器(shaders):一个脚本系统被用于使用多种不同方法来组合纹理材质来实现惊人的视觉效果。支持实时的像素渲染,凸凹反射,漫反射,反射,容积光效果,透明显示,窗口,弹眼和光泽表面。

Ⅳ 有个游戏要求显卡顶点像素着色器3.0,是什么意思

顶点像素着色器对显卡的性能影响很大,是显卡的主要参数之一。

什么是顶点着色器?
1 顶点着色器是一组指令代码,这组指令代码在顶点被渲染时执行。
2 同一时间内,只能激活一个顶点着色器。
3 每个源顶点着色器最多拥有128条指令(DirextX8.1),而在DirectX9,则可以达到256条。

为什么大家要使用顶点着色器?
1 顶点着色器可以提高渲染场景速度。
2 用顶点着色器你可以做布类仿真,高级别动画,实时修改透视效果(比如水底效果),高级光亮(需要像素着色器支持)

顶点着色器如何运作?
简单说来,运作方式如下:当渲染一个顶点时,API会执行你在顶点着色器中所写的指令。依靠这种方法,你可以自己控制每个顶点,包括渲染,确定位置,是否显示在屏幕上。

如何创建一个顶点着色器?
用一个文本编辑器就可以了!我建议你们使用notepad或者vs开发环境来创建和修改着色器。另外,必须拥有一个支持可编程着色器的显卡。写完着色器后,保存他。API就可以调用他了(Direct3D或OpenGL)。API通过一些函数来调用这些代码指令到硬件中。

什么是像素着色器?
1 像素着色器也是一组指令,这组指令在顶点中像素被渲染时执行。在每个执行时间,都会有很多像素被渲染。(像素的数目依靠屏幕的分辨率决定)
2像素着色器的指令和顶点着色器的指令非常接近。像素着色器不能像顶点着色器那样,单独存在。他们在运行的时候,必须有一个顶点着色器被激活。

为什么大家要使用像素着色器?
1 像素着色器过去是一种高级图形技术,专门用来提高渲染速度。
2 和顶点着色器一样,使用像素着色器,程序员能自定义渲染每个像素。

像素着色器如何运作?
一个像素着色器操作顶点上单独的像素。和顶点着色器一样,像素着色器源代码也是通过一些API加载到硬件的。

如何创建一个像素着色器?
也和顶点着色器一样,你只需要一个文本编辑器和支持着色器编程的显卡即可。同样,API(Direct3D OpenGL)加载像素着色器代码指令到硬件中。

我从别的地方复制的,很全面我就不再打字了。 另外SM3.0是要显卡硬件支持的,一般显卡包装上有支持DirectX 9.0C(DirectX 9.0b的只支持SM2.0)的就行了,现在的显卡一般都支持了。

Ⅵ 怎么使用顶点着色器

2.3 使用顶点着色器的步骤
阅读此文表明您已同意文末的声明

下面的列表概括了创建和使用顶点着色器的必须步骤。

1. 编写并编译顶点着色器

2. 创建一个IDirect3DVertexShader9接口以代表基于已编译着色器代码上的顶点着色器。

3. 用IDirect3DDevice9:: SetVertexShader方法允许这个顶点着色器。

当然,在我们做完这些之后,我们还得销毁这个顶点着色器。下面的各小节将更详细的迈入这些步骤。

2.3.1 编写并编译顶点着色器
首先,我们必须编写一个顶点着色器程序。在本书中的HLSL一章中,我们已经编写了我们的着色器(译者注:参见我翻译的译文第一章中各节)。一旦着色器代码写好之后,我们就使用D3DXCompileShaderFromFile函数编译这个着色器,如1.2.2节所述。回忆一下,这个函数返回一个ID3DXBuffer指针,它包含了已编译的着色器代码。

2.3.2 创建顶点着色器
一旦我们拥有了编译好的着色器代码,我们就能够获得一个IDirect3DVertexShader9接口的指针,它代表一个顶点着色器——通过使用下面的方法:

HRESULT IDirect3DDevice9::CreateVertexShader(

const DWORD *pFunction,

IDirect3DVertexShader9** ppShader

);

pFunction——已编译着色器代码的指针

ppShader——返回一个IDirect3DVertexShader9接口的指针

例如,假设变量shader是一个包含已编译着色器代码的ID3DXBuffer(的接口指针)。然后要获得一个IDirect3DVertexShader9接口,我们可以写:

IDirect3DVertexShader9* ToonShader = 0;

hr = Device->CreateVertexShader(

(DWORD*)shader->GetBufferPointer(),

&ToonShader);

注意:重申一遍,D3DXCompileShaderFromFile是一个返回已编译着色器代码(shader)的函数。

2.3.3 建立顶点着色器
在我们获得了一个代表我们的顶点着色器的IDirect3DVertexShader9接口的指针之后,我们就能够使用下面的方法允许(enable)它:

HRESULT IDirect3DDevice9::SetVertexShader(

IDirect3DVertexShader9* pShader

);

这个方法仅接受一个参数,我们在其中传递一个想要允许的顶点着色器的指针。要允许这个我们在2.3.2节创建的着色器,我们可以写:

Device->SetVertexShader(ToonShader);

2.3.4 销毁顶点着色器
和所有的Direc3D接口一样,要清除他们,我们就必须在用完它们之后调用其的Release方法。仍然以我们在2.3.2节创建的顶点着色器为例,我们写:

d3d::Release<IDirect3DVertexShader9*>(ToonShader);

[声明]:本文译自Frank Luna的《Introction to 3D Game Programming with DirectX 9.0》,限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;本文仅用于学习交流与参考用途,不得用于任何形式的商业用途;如需转载需事先征得作者本人和译者的同意,保持文章的完整性,并注明作者、译者和出处,作者保留对译文的所有权利。对于违反以上条款造成的后果,译者对此不负任何责任。我的MSN是[email protected],欢迎热爱3D图形和游戏,并有一定图形编程经验的朋友与我进行交流。

Ⅶ 如何修改标准着色器StandardShader中的Emission属性

1、利用DirectX Caps Viewer查我的显卡(GeForce 9400 GT)支持的着色器版本,是3.0,这样最好了,支持16层纹理。对于D3DXCompileShaderFromFile()这个函数,有个参数值得注意,就是Flags,书(DirectX 9.0 游戏看法编程基础)上只讲了三种合法的编译选项,但是我们如果直接在VS上运行它的代码,发现出错,就是因为这个Flags的缘故。解决办法:查看SDK,发现其实不只有三种,DX9支持10中FLAGES,而DX10支持的更多,解决方法有二:修改ps_1_1为ps_3_0,不改变FLAGES,具体看你的显卡了;方法二是修改D3DXSHADER_DEBUG为D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY可把1.0当做2.0编译,即向后兼容,不过这个编译项是DX10支持的,加入相应的库链接就可以。 2、对于编译好的shader,我们用通过CreatePixelShader获得IDirectX3DPixelShader9接口(DX都是对一些接口进行操作)的指针,要通过应用程序改变设定shader(着色器)里面的变量值或初始值,我们必须使用接口ID3DConstantTable,使用下面的语句便是初始化为默认值。 show sourceview source print? 1MultiTexCT->SetDefaults(Device);通过下面的语句进行设定: show sourceview source print? 1HRESULT SetXXX( 2 LPDIRECT3DDEVICE9 pDevice, 3 D3DXHANDLE hConstant, 4 XXX VALUE 5);对于纹理,第一步载入到相应的接口中: show sourceview source print? 1D3DXCreateTextureFromFile(Device, "crate.bmp", &BaseTex); 2D3DXCreateTextureFromFile(Device, "spotlight.bmp", &SpotLightTex); 3D3DXCreateTextureFromFile(Device, "text.bmp", &StringTex);第二步得到着色器中纹理采样器的句柄: view source print? 1BaseTexHandle = MultiTexCT->GetConstantByName(0, "BaseTex");//此BaseTex与上面的BaseTex不同,这个BaseTex是着色器里面的采样器名称,那个是纹理接口 2SpotLightTexHandle = MultiTexCT->GetConstantByName(0, "SpotLightTex"); 3StringTexHandle = MultiTexCT->GetConstantByName(0, "StringTex");第三步是设定着色器中的采样器的值,我实验了有两种方法,个人感觉书上的更繁琐一些:书上的,先用GetConstantDesc得到采样器的描述情况,由于描述情况包含了采用器的注册索引,具体参考课本: show sourceview source print? 1MultiTexCT->GetConstantDesc(BaseTexHandle, &BaseTexDesc, &count); 2 Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); 3 Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 4 Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 第二种方法是自己无意间查SDK发现的,就是直接得到采样器的注册索引,而不通过描述情况,如下: view source print? 1// base tex 2Device->SetTexture(MultiTexCT->GetSamplerIndex(BaseTexHandle), BaseTex); 3Device->SetSamplerState(MultiTexCT->GetSamplerIndex(BaseTexHandle), D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); 4Device->SetSamplerState(MultiTexCT->GetSamplerIndex(BaseTexHandle), D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 5Device->SetSamplerState(MultiTexCT->GetSamplerIndex(BaseTexHandle), D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); view source print? 1第四步就是调用来设定采样器和其绑定的纹理:<DIV class=cnblogs_Highlighter><PRE class=brush:cpp>IDirect3DDevice9::SetTexture 2 3</PRE> 4</DIV>