我已经看过许多像素着色器效果示例,像图像上的漩涡一样.但我想知道是否有人知道任何示例或教程更实用的着色器效果?
我并不是说漩涡效果没有它的用途,只是我发现的许多例子都有解释的基本效果,而不是如何巧妙地使用其他效果或过渡到产生美妙的效果.有一个视频在这里,它概述所有的WPF效果库,但我不知道我怎么会用他们有的在实际环境.
例如,当Flash 8出现模糊等效果时,我发现了一个精彩的视频,展示了如何使用模糊效果创建一个带有超速文本的炫酷效果,该视频启发了许多关于我可以用Flash中的效果做些什么的想法8.我正在寻找与Pixel Shader Effects类似的东西.
我正在关注一本名为" DirectX 11的3D游戏编程简介"的示例书
它全部用VS2010编写.我想尝试使用VS2013 ......这是Windows桌面程序的示例项目
我有一个程序包含以下内容(包括一些其他文件作为常用的一部分):
color.fx
//***************************************************************************************
// color.fx by Frank Luna (C) 2011 All Rights Reserved.
//
// Transforms and colors geometry.
//***************************************************************************************
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
struct VertexIn
{
float3 PosL : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn vin)
{
VertexOut vout;
// Transform to homogeneous clip space.
vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);
// Just pass vertex color into the …Run Code Online (Sandbox Code Playgroud) 我目前正在使用DX9/SM3,关于HLSL采样器的MSDN文档似乎非常缺乏解释如何使用不同采样器类型的方法.更糟糕的是,他们试图在一篇文章中介绍DX9和DX10,所以他们将所有关键词混在一起:
sampler Name = SamplerType {Texture = < texture_variable >; [ state_name = state_value ;] ...};
...
SamplerType
[in]采样器类型,它是以下之一:sampler,sampler1D,sampler2D,sampler3D,samplerCUBE,sampler_state,SamplerState.
Direct3D 9和Direct3D 10之间的差异:
Direct3D 10支持一种额外的采样器类型:SamplerComparisonState.
我觉得与这篇文章相反的SamplerState是DX10.实际上我看到的所有代码都sampler_state用于SamplerType.BasicHLSL(DX9)的一个简单示例:
sampler MeshTextureSampler =
sampler_state
{
Texture = <g_MeshTexture>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
Run Code Online (Sandbox Code Playgroud)
为什么所有不同的_SamplerType_s都存在,何时使用,比方说sampler或sampler2D代替sampler_state?你需要获取的时候,无论如何,如要明确tex2D,texCUBE又怎样是怎么回事?
我正在写一个着色器(HLSL),我需要将颜色值打包成R32格式.我发现了将浮动数据包装成R8G8B8A8格式的各种代码,但它们似乎都没有反过来.我的目标是SM3.0,因此(afaik)位操作不是一种选择.
总结一下,我需要能够做到这一点:
float4 color = ...; // Where color ranges from 0 -> 1
float packedValue = pack(color);
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做吗?
更新
我已经取得了一些进展......也许这将有助于澄清这个问题.
我的临时解决方案是这样的:
const int PRECISION = 64;
float4 unpack(float value)
{
float4 color;
color.a = value % PRECISION;
value = floor(value / PRECISION);
color.b = value % PRECISION;
value = floor(value / PRECISION);
color.g = value % PRECISION;
value = floor(value / PRECISION);
color.r = value;
return color / (PRECISION - 1);
}
float pack(float4 color)
{
int4 …Run Code Online (Sandbox Code Playgroud) 我需要将一个已编译的像素着色器加载到内存中以与CreatePixelShader一起使用,但我不能使用任何 D3DX调用.
我怎样才能做到这一点?
(我使用Visual Studio 2010作为编译器,使用C++作为语言)
但是pow(0,2.0)给出0
似乎任何浮点指数给出1而整数指数给出0.
我正在使用DirectX 9和hlsl编译器"D3DCompiler_43.dll".确认在Nvidia和Ati卡上.
我很迷惑!这是某种已知的行为还是错误?
为了说明效果,请尝试以下简单的测试着色器:
// Test shader demonstrating strange pow behaviour
// when brightness becomes 0 resulting color will jump to white
float4x4 WorldViewProjXf : WorldViewProjection < string UIWidget="None";>;
float Brightness
<
string UIName = "Brightness";
float UIMin = 0;
float UIMax = 1;
> = 0;
struct VS_Input
{
float4 position : POSITION0;
};
struct VS_Output
{
float4 position : POSITION0;
};
VS_Output Vertex_Func( VS_Input in_data )
{
VS_Output outData;
outData.position = mul(in_data.position, WorldViewProjXf);
return outData;
} …Run Code Online (Sandbox Code Playgroud) 几天前,我开始研究有效绘制bezier曲线,我遇到了Charles Loop和Jim Blinn开发的这种方法,看起来非常有趣.然而,经过大量的算法实验,我似乎无法让它能够渲染三次曲线.Quadratics很好,没问题.
我到目前为止找到的唯一资源如下:
为了快速启动和运行测试,我在XNA中这样做.基本上我将纹理坐标与我的顶点一起传递给GPU,应用透视变换并使用像素着色器中所有文章中提到的公式来渲染最终结果.然而,问题(我认为)在于如何计算纹理坐标.检查此代码:
public void Update()
{
float a1 = Vector3.Dot(p1, Vector3.Cross(p4, p3));
float a2 = Vector3.Dot(p2, Vector3.Cross(p1, p4));
float a3 = Vector3.Dot(p3, Vector3.Cross(p2, p2));
float d1 = a1 - 2 * a2 + 3 * a3;
float d2 = -a2 + 3 * a3;
float d3 = 3 * a3;
float discr = d1 * d1 * (3 * d2 * d2 - 4 * d1 * d3);
if (discr > 0)
{
Type …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个非常简单的着色器,它可以为适用的对象添加随机闪烁.我想这样做的方法是在像素着色器中为像素值添加一个白色的随机阴影(R = G = B).
它似乎noise()不像我希望的那样工作:
float multiplier = noise(float3(Input.Position[0], Input.Position[1], time));
Run Code Online (Sandbox Code Playgroud)
它给我"错误X4532:无法将表达式映射到像素着色器指令集",指的是调用noise().
由于我不知道在着色器调用之间保留数字的方法,我认为我不能只根据渲染前传入的种子编写一个简单的随机数生成函数.
有没有办法从像素着色器内部生成一个随机数?如果有办法,怎么样?
我还在开发一个图像处理项目,该项目利用HLSL着色器添加Photoshop-esque过滤器,如投影,斜角等.现在我正在寻找一种在HLSL中实现外部发光效果的方法.
我目前正在尝试以下想法:
1)缩放当前纹理以创建光晕(参数:glowSize,用于设置轮廓的大小)
2)模糊水平
3)模糊垂直,改变模糊颜色以发光颜色并在顶部添加原始纹理
我正在使用以下多次传递HLSL着色器来渲染光晕:
float4 PS_Scale(VS_OUTPUT IN) : COLOR0
{
float2 tex = IN.texture0;
float2 scaleCenter = float2(0.5f, 0.5f);
float2 scaleTex = (tex - scaleCenter) * glowSize + scaleCenter;
return tex2D(foreground, scaleTex);
}
float4 PS_GlowH(VS_OUTPUT IN) : COLOR0
{
float2 Tex = IN.texture0;
float4 sum = float4(0.0, 0.0, 0.0, 0.0);
sum += tex2D(secondForeground, float2(Tex.x - 4.0*blur, Tex.y))*0.05;
sum += tex2D(secondForeground, float2(Tex.x - 3.0*blur, Tex.y))*0.09;
sum += tex2D(secondForeground, float2(Tex.x - 2.0*blur, Tex.y))*0.12;
sum += tex2D(secondForeground, float2(Tex.x - blur, Tex.y))*0.15; …Run Code Online (Sandbox Code Playgroud) 我和我的教练/实验室助理一样难以理解.
出于某种原因,以下HLSL代码在输出窗口中返回:
error X8000 : D3D11 Internal Compiler error : Invalid Bytecode: Invalid operand type for operand #1 of opcode #86 (counts are 1-based).
Run Code Online (Sandbox Code Playgroud)
这是导致问题的HLSL中的函数:
// Projects a sphere diameter large in screen space to calculate desired tesselation factor
float SphereToScreenSpaceTessellation(float3 p0, float3 p1, float diameter)
{
float3 centerPoint = (p0 + p1) * 0.5f;
float4 point0 = mul( float4(centerPoint,1.0f) , gTileWorldView);
float4 point1 = point0;
point1.x += diameter;
float4 point0ClipSpace = mul(point0, gTileProj);
float4 point1ClipSpace = mul(point1, gTileProj);
point0ClipSpace …Run Code Online (Sandbox Code Playgroud)