标签: hlsl

HLSL:清空fx文件:X3000:意外标记'{'

出现以下错误:Test.fx(1,1):错误X3000:语法错误:意外标记'{'

Text.fx包含:没什么.

我也尝试了一个效果文件,在另一个测试项目中工作正常:

float4x4 mWorld;

struct TInputVertex {
    float3 vPosition    : POSITION0;
    float3 vNormal      : NORMAL0;
    float2 vTexCoord    : TEXCOORD0;
    float4 vColor       : COLOR0;
};

struct TOutputVertex {
    float4 vPosition    : POSITION0;
    float3 vNormal      : TEXCOORD1;
    float4 vColor       : COLOR0;
};

TOutputVertex vsMain(TInputVertex i) {
    TOutputVertex o;

    o.vPosition = mul(float4(i.vPosition, 1), mWorld);
    o.vColor = i.vColor;

    o.vNormal = mul(float4(i.vNormal, 1), mWorld).xyz;

    //o.vColor += pow(dot(normal_world, float3(0, 0, 1)) * 2 + 0.3, 10);

    return o;
}

struct TInputFragment {
    float3 vNormal      : …
Run Code Online (Sandbox Code Playgroud)

directx hlsl

6
推荐指数
1
解决办法
5244
查看次数

着色器帧缓冲器回读

我想知道在较新的着色器模型中是否支持从目标帧缓冲区读回像素值.我认为这在绘图管道的后期(非可编程)阶段是完成的,这使我希望这个特性可能已被添加到可编程管道中.

我知道可以绘制到纹理绑定的帧缓冲区,然后将此纹理发送到着色器,我只是希望有一种更优雅的方式来实现相同的功能.

glsl hlsl pixel-shader fragment-shader

6
推荐指数
1
解决办法
4065
查看次数

稀疏八叉树的高效存储?

任何人都可以建议一种快速,有效的存储和访问稀疏八叉树的方法吗?

优选地,可以在HLSL中容易地实现.(我正在使用光线投射/体素应用)

在这种情况下,树可以预先计算,所以我主要关心的是大小和搜索时间.

更新

对于任何想要这样做的人来说,更有效的解决方案可能是将节点存储为使用Z阶曲线/ Morton树生成的线性八叉树.这样做可以消除内部节点的存储,但可能需要使用第二个"数据纹理"交叉引用线性树阵列,其中包含有关单个体素的信息.

c# xna sparse-array hlsl octree

6
推荐指数
1
解决办法
5058
查看次数

转换顺序:投影纹理(HLSL)

当我在nvidia 阅读关于投影纹理(9.3.2)的这篇文章时,我遇到了这个图:

http://http.developer.nvidia.com/CgTutorial/elementLinks/252equ01.jpg

编写转换的顺序使我感到困惑.这是因为我学会了从左到右阅读矩阵乘法,也因为我认为变换序列应按此顺序排列:

http://http.developer.nvidia.com/CgTutorial/elementLinks/fig4_1.jpg

现在我的问题如下:

因为矩阵乘法不是可交换的,所以乘法的顺序是什么?

如果它确实与正常对象的转换序列顺序相同,为什么它会像这样写?

按照相同的顺序顺序,我的意思是像这个hlsl代码:

float4 worldPosition        = mul(input.Position, World);
float4 viewPosition         = mul(worldPosition, View);
output.Position             = mul(viewPosition, Projection);
Run Code Online (Sandbox Code Playgroud)

最后(这是可选的,但对于其他想知道相同的人可能有用),如何编写HLSL代码来执行此投影纹理乘法,或者如果通过XNA传递完整的Matrix,您将如何进行转换.

xna transformation matrix hlsl

6
推荐指数
1
解决办法
911
查看次数

在GLSL中混合多个纹理

这很长,但我保证这很有意思.:)

我正在尝试使用jMonkeyEngine模仿另一个应用程序纹理的外观.我有一个顶点列表和构成"景观网格"的面(三角形),应该用大约7-15种不同的纹理(取决于"景观"的地形)进行纹理化.每个三角形都有一个与之关联的纹理代码,表示特定三角形应该主要由哪个纹理组成.当然,纹理应该在每个面之间平滑地融合.

所以我正在尝试开发一种允许这种方法的策略(它不使用预先制作的alpha map png文件,纹理alphas需要在运行时完成).现在我想,如果我计算出每个纹理的"实力"在每个顶点(在顶点着色器) - 由地形类型所有的保理它相邻的面(不确定如何做到这一点还) - 我应该能够根据像素距顶点的距离设置alpha值.frag着色器将使用生成的"alpha贴图"来混合每个像素的每个纹理.

这是否可行,或者我应该看一个完全不同的策略?我有我试图模仿的应用程序的着色器代码(但它们是HLSL,我正在使用GLSL),但似乎他们正在其他地方进行这种混合步骤:

    sampler MeshTextureSampler = sampler_state { Texture = diffuse_texture; AddressU = WRAP; AddressV = WRAP; MinFilter = LINEAR; MagFilter = LINEAR; }; 
Run Code Online (Sandbox Code Playgroud)

我不知道这是什么HLSL"MeshTextureSampler"是,但它似乎像这样的应用程序可能已经预先混合作为所需的所有纹理,并根据面部/地形数据的代码创建一个单一的质地为整个网格.在像素/片段着色器中,他们真正做的就是:

float4 tex_col = tex2D(MeshTextureSampler, In.Tex0);
Run Code Online (Sandbox Code Playgroud)

在那之后它只是阴影,灯光等 - 据我所知,没有任何纹理混合,这让我相信这种纹理混合工作是事先在CPU上完成的,我想.欢迎任何建议.

opengl 3d shader glsl hlsl

6
推荐指数
1
解决办法
2275
查看次数

HLSL mul()变量澄清

HLSL的mul(x,y)的参数在这里表示:说

  • 如果x是向量,则将其视为行向量.
  • 如果y是向量,则将其视为列向量.

这是否遵循以下含义:

一个.

  • 如果x是向量,则y被视为a row-major matrix
  • 如果y是向量,则x被视为a column-major matrix

因为ID3DXBaseEffect :: SetMatrix()传入a row-major matrix,所以我会按照以下顺序使用传递到着色器的矩阵:

恩.Output.mPosition = mul( Input.mPosition, SetMatrix()value );

我刚开始使用着色器和当前重新学习矩阵数学.如果有人能澄清这一点会很好.

c++ directx hlsl

6
推荐指数
2
解决办法
9419
查看次数

在编写着色器时,我应该避免创建多个变量吗?

我现在开始学习着色器(HLSL,GLSL),我看到了许多教程,其中创建的变量不多,这使得阅读变得更加困难.我想知道新变量的创建是否会影响着色器的性能.

所以,例如(在CG中):

这是

    inline float alphaForPos(float4 pos, float4 nearVertex){
            return (1.0/_FogMaxRadius)*clamp(_FogRadius - max(length(pos.z - nearVertex.z),length(pos.x - nearVertex.x)), 0.0, _FogRadius)/_FogRadius;
    }
Run Code Online (Sandbox Code Playgroud)

比这更快?

    inline float alphaForPos(float4 pos, float4 nearVertex){
        float distX = length(pos.x - nearVertex.x);
        float distZ = length(pos.z - nearVertex.z);
        float alpha = 0.0;
        alpha = _FogRadius - max(distZ,distX);
        alpha = clamp(alpha, 0.0, _FogRadius);
            return (1.0/_FogMaxRadius)*alpha/_FogRadius;
    }
Run Code Online (Sandbox Code Playgroud)

shader glsl hlsl glsles

6
推荐指数
1
解决办法
750
查看次数

GLSL/HLSL - 与单个块相对的多个单行条件语句

对抗锯齿方法做了一些研究,我偶然发现了这段代码(从Nvidia的FXAA着色器中抓取):

if(!pairN) lumaN = lumaS;
if(!pairN) gradientN = gradientS;
if(!pairN) lengthSign *= -1.0;
Run Code Online (Sandbox Code Playgroud)

是不是有一个很好的理由不是作为以下内容写的?

if (!pairN) {
    lumaN = lumaS;
    gradientN = gradientS;
    lengthSign *= -1.0;
}
Run Code Online (Sandbox Code Playgroud)

我认为这是某种优化?看起来真的违反直觉......

opengl boolean-logic gpu glsl hlsl

6
推荐指数
1
解决办法
1441
查看次数

Shader的功能参数性能

我试图了解如何在着色器语言中实现传递参数.

我已经阅读了几篇文章和文档,但我仍然有些疑惑.特别是我试图理解C++函数调用的差异,特别强调性能.

HSLS,Cg和之间略有差异,GLSL但我想下划线的实现非常相似.

到目前为止我所理解的:

  • 除非另有说明,否则函数参数总是按值传递(即使矩阵也是如此?)
  • 在这种情况下,通过价值传递与其具有不同的含义C++.不支持递归,因此不使用堆栈,并且大多数函数都是内联的,并且参数直接放入寄存器中.
  • 函数通常由default(HLSL)内联,或者至少内联关键字始终受编译器(Cg)的尊重

上面的考虑是对的吗?

现在2具体问题:

1)传递矩阵作为函数参数

inline float4 DoSomething(in Mat4x4 mat, in float3 vec)
{
  ...
} 
Run Code Online (Sandbox Code Playgroud)

考虑到上面的功能,C++这将是令人讨厌的,并且肯定会更好地使用引用:const Mat4x4&.

着色器怎么样?这是一个糟糕的方法吗?我读过,例如,inout限定符可用于通过引用传递矩阵,但实际上它暗示了被调用函数修改的矩阵.

2)数量(和参数类型)是否有任何含义?例如,更好地使用具有有限参数集的函数?或者避免传递矩阵?是inout修改在这里提高性能的有效方法是什么?如果是这样,任何人都知道典型的编译器如何实现它?

3)是否有任何区别HLSLGLSL说明吗?有人有这方面的提示吗?

opengl directx shader glsl hlsl

6
推荐指数
1
解决办法
4152
查看次数

Unity Shader-如何有效地重新着色特定坐标?

首先,请允许我解释一下我所拥有的,然后再讨论下一个要解决的问题。

我有什么

我有一个带纹理的自定义网格物体,其某些边缘与Unity中的整数世界坐标完全对齐。在网格中,我添加了自己的粗糙但有效的自定义表面着色器,如下所示:

    Shader "Custom/GridHighlightShader"
{
    Properties
    {
        [HideInInspector]_SelectionColor("SelectionColor", Color) = (0.1,0.1,0.1,1)
        [HideInInspector]_MovementColor("MovementColor", Color) = (0,0.205,1,1)
        [HideInInspector]_AttackColor("AttackColor", Color) = (1,0,0,1)
        [HideInInspector]_GlowInterval("_GlowInterval", float) = 1
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Glossiness("Smoothness", Range(0,1)) = 0.5
        _Metallic("Metallic", Range(0,1)) = 0.0
    }
        SubShader
        {
            Tags { "RenderType" = "Opaque" }
            LOD 200

            CGPROGRAM
            // Physically based Standard lighting model, and enable shadows on all light types
            #pragma surface surf Standard fullforwardshadows

            // Use shader model 3.0 target, to get nicer looking lighting
            #pragma …
Run Code Online (Sandbox Code Playgroud)

shader cg hlsl unity-game-engine

6
推荐指数
1
解决办法
284
查看次数