从这个网站:http://www.toymaker.info/Games/html/vertex_shaders.html
我们有以下代码段:
// transformations provided by the app, constant Uniform data
float4x4 matWorldViewProj: WORLDVIEWPROJECTION;
// the format of our vertex data
struct VS_OUTPUT
{
float4 Pos : POSITION;
};
// Simple Vertex Shader - carry out transformation
VS_OUTPUT VS(float4 Pos : POSITION)
{
VS_OUTPUT Out = (VS_OUTPUT)0;
Out.Pos = mul(Pos,matWorldViewProj);
return Out;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么结构VS_OUTPUT有一个4维向量作为它的位置?位置只是x,y和z?
我目前正在开发一个使用C++和DirectX9的项目,我正在研究创建一个随着时间的推移颜色不同的光源.
我知道C++有一个timeGetTime()函数,但想知道是否有人知道HLSL中的一个函数允许我这样做?
问候.麦克风.
我正在制作一种与hlsl非常相似但只支持像素着色器的小语言.此语言使用reflection.emit构建实现相同功能的点网络程序集.我正在测试我的分支指令"if"的实现,并且在我的一个单元测试中(一个大的if if inner if else)失败并出现以下错误消息:
System.NotSupportedException:位置上的非法单字节分支:32.请求的分支是:132.
在我的案例OpCodes.Br_S中,我已经将问题追溯到使用简短格式指令.解决方案很简单,我用OpCodes.Br替换了OpCodes.Br_S但是我对这个解决方案有几个问题:
此解决方案对生成的代码的性能有影响吗?如果我想为单个字节正确生成Br_S而对于其他情况需要Br,我该怎么做?这里的问题是我正在使用访问者模式和像"if"这样的分支指令我必须首先输出Br或Br_s,此时我无法知道剩下的代码是否需要多个单字节跳到标签.为了更好地说明我的问题,这是我为以下语句生成的代码:
我的语言:
int a = -1; if (1>1) { a=1; } else if(2>2) { a=2; }
IL:
.method public virtual final instance int32 Main() cil managed
{
.maxstack 4
.locals init (
[0] int32 num)
L_0000: ldc.i4.m1
L_0001: stloc.0
L_0002: ldc.i4.1
L_0003: ldc.i4.1
L_0004: ble.s L_000a
L_0006: ldc.i4.1
L_0007: stloc.0
L_0008: br.s L_0010
L_000a: ldc.i4.2
L_000b: ldc.i4.2
L_000c: ble.s L_0010
L_000e: ldc.i4.2
L_000f: stloc.0
L_0010: ldloc.0
L_0011: ret
Run Code Online (Sandbox Code Playgroud)
}
int a … 谷歌搜索"HLSL编译器"和一些东西,我很沮丧地无法找到在哪里寻找D3D9的独立HLSL编译器,所以我可以告诉哪些行导致问题.
我在SDK中看不到任何内容,但也许它有一个我无法识别的名字?
我正在编写一个着色器,对从场景渲染的纹理产生模糊效果.我需要在2过去做到这一点,所以通过P0我做一个水平模糊,而在P1传递垂直模糊.
问题是:
如果我在单次传球上写下我获得了预期的结果,但我真的需要在2次传球中完成.
有人可以帮我吗?
是我的第一个接近HLSL的方法.
谢谢大家!
FOX_ITA
我被要求将以下问题分成多个问题:
这是问第一个问题,我可以在HLSL 3中运行没有顶点着色器的像素着色器.在HLSL 2中,我注意到你可以,但我似乎无法在3中找到方法?
着色器将编译正常,然后我将在调用SpriteBatch Draw()时从Visual Studio获得此错误.
"不能将着色器模型3.0与早期的着色器模型混合使用.如果顶点着色器或像素着色器编译为3.0,则它们必须都是."
我不相信我已经在着色器中定义了任何早于3的东西.所以我有点困惑.任何帮助,将不胜感激.
首先,我对DirectX11完全不熟悉.由于微软在Windows 8发布时弃用了Effects&D3DX,我想使用Effects的替代品.但是我不知道该怎么做,我只知道每个HLSL文件必须有1个特定着色器的入口点(顶点,像素,计算......).基本上就是这样,所以,有没有人知道关于没有效果的hlsl着色器的好教程?或者有人可以告诉我他们是如何做到的?
提前致谢!
我正在寻找Unity的玻璃着色器,它只能折射它背后的物体,或者想要如何修改现有的玻璃着色器来做到这一点.
此屏幕截图显示了在曲面网格上使用FX/Glass/Stained BumpDistort时会发生什么.
如您所见,玻璃着色器折射网格前面的球体和网格后面的地面.我正在寻找一个只能折射它背后的物体的着色器.
以下是该着色器的代码,供参考:
// Per pixel bumped refraction.
// Uses a normal map to distort the image behind, and
// an additional texture to tint the color.
Shader "FX/Glass/Stained BumpDistort" {
Properties {
_BumpAmt ("Distortion", range (0,128)) = 10
_MainTex ("Tint Color (RGB)", 2D) = "white" {}
_BumpMap ("Normalmap", 2D) = "bump" {}
}
Category {
// We must be transparent, so other objects are drawn before this one.
Tags { "Queue"="Transparent" "RenderType"="Opaque" }
SubShader {
// This …Run Code Online (Sandbox Code Playgroud) 它说:Invalid vs_2_0输出语义SV_Target.
因此,Visual Studio 2017正在编译我的像素着色器,好像它是一个顶点着色器.但在属性面板中,我将其指定为ps_5_0.有没有我应该指定的东西?
顶点着色器: -
cbuffer ConstantBuffer : register(b0)
{
matrix World;
matrix View;
matrix Projection;
}
struct Input {
float3 Pos : POSITION;
float4 Color: COLOR;
};
struct VS_OUTPUT
{
float4 Pos : SV_POSITION;
float4 Color : COLOR0;
};
VS_OUTPUT main(Input input)
{
VS_OUTPUT output = (VS_OUTPUT)0;
output.Pos = mul(input.Pos, World);
output.Pos = mul(output.Pos, View);
output.Pos = mul(output.Pos, Projection);
output.Color = input.Color;
return output;
}
Run Code Online (Sandbox Code Playgroud)
像素着色器: -
struct VS_OUTPUT
{
float4 Pos : …Run Code Online (Sandbox Code Playgroud)