public override int?Fragment(FragmentShaderState state) { var tx = (int)(state.Varying.PopFloat() * (_texture.Width - 1)); var ty = (int)(state.Varying.PopFloat() * (_texture.Height - 1)); return(_texture[tx, ty]); }
public ShaderState(int size, World world) { _world = world; _face = new FaceShaderState(world); _vertex = new VertexShaderState(size, world); _fragment = new FragmentShaderState(size, world); }
public override int?Fragment(FragmentShaderState state) { var color = _innerShader.Fragment(state); if (color == null) { return(null); } var intensity = state.Varying.PopFloat(); if (intensity < 0) { return(BlackColor); } if (intensity > 1) { intensity = 1; } var intColor = new IntColor { Color = color.Value }; intColor.Red = (byte)(intColor.Red * intensity); intColor.Green = (byte)(intColor.Green * intensity); intColor.Blue = (byte)(intColor.Blue * intensity); return(intColor.Color);; }
public override int?Fragment(FragmentShaderState state) { var z = (byte)state.Varying.PopFloat(); var color = new IntColor { Red = z, Green = z, Blue = z }; return(color.Color); }
public override int?Fragment(FragmentShaderState state) { var color = _innerShader.Fragment(state); if (color == null) { return(null); } var intensity = state.Intensity; var intColor = new IntColor { Color = color.Value }; intColor.Red = (byte)(intColor.Red * intensity); intColor.Green = (byte)(intColor.Green * intensity); intColor.Blue = (byte)(intColor.Blue * intensity); return(intColor.Color); }
public override int?Fragment(FragmentShaderState state) { var color = _innerShader.Fragment(state); if (color == null) { return(null); } var normal = state.Varying.PopVector3(); normal = Vector3.Normalize(normal); var intensity = Vector3.Dot(normal, _light); if (intensity < 0) { return(BlackColor); } if (intensity >= 1) { intensity = 1; } //const float intensityStepsCount = 5; //intensity = (float)Math.Floor(intensity * intensityStepsCount) / intensityStepsCount; var intColor = new IntColor { Color = color.Value }; intColor.Red = (byte)(intColor.Red * intensity); intColor.Green = (byte)(intColor.Green * intensity); intColor.Blue = (byte)(intColor.Blue * intensity); return(intColor.Color); }
public override int?Fragment(FragmentShaderState state) { return(_color); }
private void DrawFilling(WritableTexture screen, int startY, int endY, Vector3 v0, Vector3 v1, Vector3 v2, FragmentShaderState fragmentState, FaceShaderState faceState, VertexShaderState vertexState, Shader shader) { var x0 = (int)Math.Round(v0.X); var y0 = (int)Math.Round(v0.Y); var x1 = (int)Math.Round(v1.X); var y1 = (int)Math.Round(v1.Y); var x2 = (int)Math.Round(v2.X); var y2 = (int)Math.Round(v2.Y); int minX = ClipX(Math3(x0, x1, x2, Math.Min)); int minY = ClipY(Math3(y0, y1, y2, Math.Min), startY, endY); int maxX = ClipX(Math3(x0, x1, x2, Math.Max)); int maxY = ClipY(Math3(y0, y1, y2, Math.Max), startY, endY); float midX = (v0.X + v1.X + v2.X) / 3; float midY = (v0.Y + v1.Y + v2.Y) / 3; var dirV0 = new Vector3(v0.X - midX, v0.Y - midY, 0); var dirV1 = new Vector3(v1.X - midX, v1.Y - midY, 0); var direction = Vector3.Cross(dirV0, dirV1).Z; if (direction < 0) { Vector3 tbuf; tbuf = v1; v1 = v2; v2 = tbuf; } var line1 = new Line(v0.X, v0.Y, v1.X, v1.Y, minX, minY); var line2 = new Line(v1.X, v1.Y, v2.X, v2.Y, minX, minY); var line3 = new Line(v2.X, v2.Y, v0.X, v0.Y, minX, minY); var converter = new BarycentricCoordinatesConverter(v0.X, v0.Y, v1.X, v1.Y, v2.X, v2.Y); var writer = screen.GetWriter(minY); for (int y = minY; y <= maxY; y++) { for (int x = minX; x <= maxX; x++) { var curr1 = line1.Value; var curr2 = line2.Value; var curr3 = line3.Value; if (curr1 >= 0 && curr2 >= 0 && curr3 >= 0) { var p = converter.Convert(x, y); if (p.A < 0 || p.B < 0 || p.C < 0) { continue; } var z = v0.Z * p.A + v1.Z * p.B + v2.Z * p.C; if (z < _zBuffer[x, y]) { continue; } fragmentState.Clear(); fragmentState.Intensity = faceState.Intensity; for (var i = 0; i < vertexState.Varying[0].Count; i++) { var fragmentValue = vertexState.Varying[0][i] * p.A + vertexState.Varying[1][i] * p.B + vertexState.Varying[2][i] * p.C; fragmentState.Varying.Add(fragmentValue); } var resColor = shader.Fragment(fragmentState); if (resColor != null) { _zBuffer[x, y] = z; writer.Write(x, resColor.Value); } } line1.StepX(); line2.StepX(); line3.StepX(); } line1.StepY(); line2.StepY(); line3.StepY(); writer.NextLine(); } }