1

私が取り組んでいるプロジェクトの HLSL ピクセル シェーダーを作成しようとしています。基本的にやりたいのは、テクスチャに float 値が 0.52 のピクセルがある場合 (スケール 0-255 は 132.6)、133 を 60% の時間で出力し、132 を 40% の時間で出力したいということです。今書いてください、私はRGB値の残りの部分を出力しようとしているだけです(つまり、ピクセルを増やす可能性があります)しかし、私は常にゼロの値を取得します)これは、色が0〜255スケールに量子化されているためだと思いますシェーダーに到達する前ですが、色に関する多くの情報を保存できる A32B32G32R32f 形式を使用しているため、これがなぜなのかわかりません。これが私の非常に単純なシェーダーコードです。それが問題になる場合は、SlimDX (DX9) を使用しています。

sampler2D Tex0 : register(s0);
float4 DitherByChance(float2 coords : TEXCOORD0) : COLOR
{
    float4 newColor = float4(0, 0, 0, 0);   // The pixel color to return
    double4 oldColor = tex2D(Tex0, coords);
    double scale = 0.0039215686274509803921568627451;  // 1 / 255

    double rPercentChance = frac(oldColor.r / scale);   //Chance to round red channel up
    double gPercentChance = frac(oldColor.g / scale);   //Chance to round green channel up
    double bPercentChance = frac(oldColor.b / scale);   //Chance to round blue channel up

    newColor.r = rPercentChance;
    newColor.g = gPercentChance;
    newColor.b = bPercentChance;

    newColor.a = 1;

    return newColor;
}

technique DitherViaChance  
{  
    pass Pass1  
    {  
        PixelShader = compile ps_2_0 DitherByChance();      
    }  
}

重要な場合、これが私のslimDXコードです。

Public Class TextStimulusDisplay
    Inherits BaseStimulusDisplay

    Protected ditherByChanceEffect As PixelShader
    Protected psByteCode As ShaderBytecode
    Protected gStream As DataStream
    Protected ditherBC As Effect

    Protected tex As Texture
    Protected spriteRender As Sprite

    Public displaySettings As DisplaySettings
    Public charText As Texture
    Public randomText As Texture

    Protected rando As Random

    Public Sub New(ByVal displaysettings As DisplaySettings, Optional ByVal WindowedMode As Boolean = False)
        MyBase.New(New Size(displaysettings.xResolution, displaysettings.yResolution), WindowedMode)
        Me.displaySettings = displaysettings
    End Sub

    Public Overrides Sub CreateDeviceResources()
        MyBase.CreateDeviceResources()
        ditherBC = Effect.FromFile(device, Application.StartupPath & "\effects\DitherByChance.fx", ShaderFlags.Debug)
        rando = New Random()

        randomText = New Texture(device, 100, 100, 1, Usage.Dynamic, Format.A32B32G32R32F, Pool.Default)
        Dim data(80000) As Byte
        rando.NextBytes(data)
        Dim dataBox As DataRectangle = randomText.GetSurfaceLevel(0).LockRectangle(LockFlags.None)
        dataBox.Data.Seek(0, IO.SeekOrigin.Begin)
        dataBox.Data.Write(data, 0, data.Length)
        dataBox.Data.Close()
        randomText.GetSurfaceLevel(0).UnlockRectangle()

        device.SetTexture(1, randomText)

        'psByteCode = ShaderBytecode.CompileFromFile(Application.StartupPath & "\effects\DitherByChance.fx", "DitherByChance", "ps_2_0", ShaderFlags.None)
        'ditherByChanceEffect = New PixelShader(device, psByteCode)
        'device.PixelShader = ditherByChanceEffect
        spriteRender = New Sprite(device)
        spriteRender.Transform = Matrix.Identity
        tex = createCharacterTexture()

    End Sub

    Public Overrides Sub ReleaseDeviceResources()
        MyBase.ReleaseDeviceResources()
    End Sub

    Public Overrides Sub RenderScene()
        'ditherBC.Technique = ditherBC.GetTechnique("DitherViaChance")

        Me.device.BeginScene()
        spriteRender.Begin(SpriteFlags.None)
        ditherBC.Begin()
        ditherBC.BeginPass(0)
        spriteRender.Draw(tex, New Rectangle(0, 0, 50, 50), New Color4(1, 1, 1))
        'spriteRender.Draw(randomText, New Rectangle(0, 0, 1000, 1000), New Color4(1, 1, 1))
        spriteRender.End()
        ditherBC.EndPass()
        ditherBC.End()
        Me.device.EndScene()
    End Sub

    Public Function createCharacterTexture() As Texture
        Dim RtsHelper As RenderToSurface = New RenderToSurface(device, 100, 100, Format.A32B32G32R32F)
        Dim texture As Texture = New Texture(device, 100, 100, 1, Usage.RenderTarget, Format.A32B32G32R32F, Pool.Default)

        Dim sloanFont As Font = New Font(device, 98, 98, FontWeight.Normal, 1, False, CharacterSet.Default, Precision.Default,
                                         FontQuality.ClearTypeNatural, PitchAndFamily.Default, "Sloan")


        RtsHelper.BeginScene(texture.GetSurfaceLevel(0), New Viewport(0, 0, 100, 100))



        sloanFont.DrawString(Nothing, "A", 1, 1, New SlimDX.Color4())
        RtsHelper.EndScene(Filter.None)

        Font.Dispose()
        RtsHelper.Dispose()

        Return texture
    End Function
End Class
4

0 に答える 0