小编bar*_*boy的帖子

使用Shader Model 2.0的HLSL for循环:错误X3511无法展开循环

在Shader Model 2.0下的HLSL着色器中编译以下for循环时,我得到错误X3511.

for (int x = -5; x <= 5; x++)
{
    for (int y = -5; y <= 5; y++)
    {
            ...
Run Code Online (Sandbox Code Playgroud)

错误内容如下:无法展开循环,循环似乎没有及时终止(5次迭代),使用[unroll(n)]属性强制使用更高的数字.

我知道这个错误消息,但是我没有在for语句的条件部分使用变量 - 这是一个硬编码的x <= 5条件.这有什么不对?

提前致谢!

shader loops for-loop hlsl

8
推荐指数
1
解决办法
4971
查看次数

外发光为HLSL着色器

我还在开发一个图像处理项目,该项目利用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)

directx image-processing hlsl outline glow

8
推荐指数
1
解决办法
4793
查看次数

在托管代码和非托管代码之间共享Graphics对象时丢失抗锯齿功能

在本机C++和C#之间传递Graphics对象

我目前正在开发类似Paint .NET的应用程序.我有多种类型的层,用C#实现.这些图层被绘制到由WinForms用户控件提供的.NET Graphics对象中 - 它类似于WPF画布控件.图层基类有一个Draw方法,实现如下:

public void Draw(IntPtr hdc)
{
    using (var graphics = Graphics.FromInternalHDC(hdc)
    {
         // First: Setup rendering settings like SmoothingMode, TextRenderingHint, ...
         // Layer specific drawing code goes here...
    }
}
Run Code Online (Sandbox Code Playgroud)

对于性能和反编译问题,我正在混合模式程序集中进行层的组合,因为我还应用了斜角或投影等效果.包装器,当然是用C++/CLI编写的,直接从canvas控件调用,并将每个层的元数据和目标Graphics对象(来自我的C#编写的canvas用户控件的Graphics对象)转发到本机C++类.

C++/CLI包装器:

public ref class RendererWrapper
{
   public:
        void Render(IEnumerable<Layer^>^ layersToDraw, Graphics^ targetGraphics)
        {
            // 1) For each layer get metadata (position, size AND Draw delegate)
            // 2) Send layer metadata to native renderer
            // 3) Call native renderer Render(targetGraphics.GetHDC()) method
            // 4) Release targetGraphics …
Run Code Online (Sandbox Code Playgroud)

c# graphics mixed-mode gdi+ c++-cli

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

用于在任何alpha透明图像周围绘制轮廓或笔划的算法

不确定我正在开发的这个算法是否有任何名称 - "增长邻域算法"听起来像一个合适的名称.那我的问题是什么?

我想在alpha透明图像周围绘制一个笔划来勾画它.笔划的大小应该是用户可定义的.

我有一个由零和1填充的数组,将数组中的每个项目视为生命游戏中的单元格.具有0的项目是空的(透明像素),具有1的项目是第一代单元格(非透明像素),世代的数量由周围笔划的大小定义.

此示例描绘了由Alpha值包围的矩形:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 0 0 …
Run Code Online (Sandbox Code Playgroud)

algorithm image-processing

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