gpt4 book ai didi

c# - HLSL 和 XNA : How do I get the position and color of surrounding pixels of the current pixel shader iteration?

转载 作者:太空宇宙 更新时间:2023-11-03 16:20:51 26 4
gpt4 key购买 nike

摘要和目标:

我正在尝试制作一个着色器来为游戏编辑器执行简单的窗口效果。该效果将绘制一个具有低值边框颜色和高值突出显示的框架。我尝试了很多方法,但总的来说,我只提出了一种可能的解决方案来使用 GPU 实现这一目标。

首先,我创建了一个自定义顶点类型,用于在屏幕空间中存储向量的 XY 坐标。

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace WindowsGame1 {
public struct Vertex2D : IVertexType {
public Vector2 Position;
public static readonly VertexDeclaration VertexDeclaration = new VertexDeclaration(new VertexElement(0, VertexElementFormat.Vector2, VertexElementUsage.Position, 0));

public Vertex2D(float x, float y) {
Position = new Vector2(x, y);
}

VertexDeclaration IVertexType.VertexDeclaration {
get {
return VertexDeclaration;
}
}
}
}

接下来我创建一个自定义窗口类的实例。构造函数设置顶点缓冲区并设置效果中的 View 、投影和颜色参数。

这是效果文件。

float4x4 view;
float4x4 projection;
float4 color;
float shadowPercent = 0.36893203883495145631067961165049;
float highlightPercent = 1.262135922330097087378640776699;
Texture2D targetTexture;

struct FillVertexShaderInput {
float4 position : POSITION0;
};

struct FillPixelShaderInput {
float4 position : POSITION0;
};

struct BorderPixelShaderInput {
float4 position : SV_Position;
};

// Transforms color component range from 0-255 to 0-1.
float4 ClampColor(float4 color) {
return float4(color[0] / 255, color[1] / 255, color[2] / 255, color[3] / 255);
}

// Shifts the value of a color by a percent to get border color and highlight color from a fill color.
float4 ShiftValue(float4 color, float percent) {
return float4(clamp(color[0] * percent, 0, 1), clamp(color[1] * percent, 0, 1), clamp(color[2] * percent, 0, 1), clamp(color[3] * percent, 0, 1));
}

FillPixelShaderInput FillVertexShader(FillVertexShaderInput input) {
FillPixelShaderInput output;
output.position = mul(mul(input.position, view), projection);
return output;
}

float4 FillPixelShader(FillPixelShaderInput input) : COLOR0 {
return color;
}

float4 BorderPixelShader(BorderPixelShaderInput input) : COLOR0 {
// Get color of pixel above?
// float4 tempColor = texture.Sample(sampler, (input.position[0], input.position[1] - width));
return color;
}

technique Frame {
// Store Texture2D, sampler2D, and others to be stored between passes?
/*Texture2D texture;
sampler2D sampler;
float width;
float height;
texture.GetDimensions(width, height);
color = ClampColor(color);
float4 shadowColor = ShiftValue(color, shadowPercent);
float4 highlightColor = ShiftValue(color, highlightPercent);*/

pass Fill {
VertexShader = compile vs_2_0 FillVertexShader();
PixelShader = compile ps_2_0 FillPixelShader();
}

pass Border {
PixelShader = compile ps_4_0 BorderPixelShader();
}
}

我希望能够在传递之间存储数据,但我不知道这是否可行,所以我尝试在 XNA 中存储渲染目标并将其用作下一次传递的参数。

这里是Window的Draw代码。

public void Draw(Game1 game) {
// rectangle is a simple window for this test.
RenderTarget2D target = new RenderTarget2D(game.GraphicsDevice, rectangle.Width, rectangle.Height);
game.GraphicsDevice.SetRenderTarget(target);
game.GraphicsDevice.BlendState = BlendState.AlphaBlend;
game.GraphicsDevice.Clear(Color.Transparent);
game.GraphicsDevice.SetVertexBuffer(vertexbuffer);
effect.Techniques["Frame"].Passes["Fill"].Apply();
game.GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);
game.GraphicsDevice.SetRenderTarget(null);
effect.Parameters["targetTexture"].SetValue(target);
effect.Techniques["Frame"].Passes["Border"].Apply();
}

如果我能在像素着色器中获取当前像素周围像素的位置和颜色,我就能确定在当前位置绘制什么颜色的像素。填充工作正常。我只是不知道绘制边框阴影和高光的最佳方法。我也遇到了 alpha 混合问题。除了窗口之外的所有内容都是默认的深紫色,即使我设置了 alpha 混合并将渲染目标缓冲区清除为透明。

如果您决定提供帮助,在此先感谢您。

最佳答案

我相信它是这样工作的:

PixelShaderOutput PixelShaderFunction(VertexShaderOutput input, float2 vPos : VPOS)
{
// shader code here
}

然后您可以只使用vPos.xvPos.y 来访问当前正在处理的像素的坐标。

关于c# - HLSL 和 XNA : How do I get the position and color of surrounding pixels of the current pixel shader iteration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13945582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com