メディア処理演習 CG: 3 Excel 4 6. 6.2.xls 6.6 図 6.4 アルファブレンディング処理 6.6.1 0 1 0 1 ScanlineWithAlpha 1 '' Sub ScanlineWithAlpha(x0, y0, a0, x1, y1, a1, xmin, xmax, amin, amax) ' x y dx = x1 - x0 dy = y1 - y0 ' da = a1 - a0 ' 2 P0 ' If dx = 0 And dy = 0 Then xmin(ya) = x0 xmax(ya) = x0 amin(ya) = a0 ' dmin -> amin amax(ya) = a0 ' dmax -> amax Exit Sub ' x sx sx = 1 If dx < 0 Then dx = -dx sx = -sx ' y sy sy = 1 If dy < 0 Then dy = -dy sy = -sy ' ' dx2 = dx * 2 dy2 = dy * 2 ' m -1 m 1 If dx > dy Then dalpha = da / dx ' E = dy2 y = y0 alpha = a0 For x = x0 To x1 Step sx If x < xmin(y) Or xmin(y) = 0 Then xmin(y) = x amin(y) = alpha If x > xmax(y) Or xmax(y) = 0 Then
xmax(y) = x amax(y) = alpha C = C src src + C dst (1 src ) (6.8) If E < dx Then E = E + dy2 E = E + dy2 - dx2 y = y + sy C dst C src, α src alpha = alpha + dalpha Next x ' m m 1 dalpha = da / dy ' E = dx2 x = x0 alpha = a0 For y = y0 To y1 Step sy If x < xmin(y) Or xmin(y) = 0 Then xmin(y) = x amin(y) = alpha If x > xmax(y) Or xmax(y) = 0 Then xmax(y) = x amax(y) = alpha If E < dy Then E = E + dx2 E = E + dx2 - dy2 x = x + sx alpha = alpha + dalpha Next y ScanlinewithAlpha 6.6.2 図 6.5 不透明度を考慮したピクセル値の計算 DrawPixelWithAlpha ' Sub DrawPixelWithAlpha(x, y, alpha, sr, sg, sb) ' color_buffer color_buffer = ColorBufferSheetname + CStr(BackBufferID) ' dc dc = Worksheets(color_buffer).Cells(y, x).interior.color ' dc RGB ' dc = dr + dg * 256 + db * 256 * 256 dr = dc Mod 256 dg = Int(dc / 256) Mod 256 db = Int(dc / 65536) ' r = sr * alpha + dr * (1 - alpha) g = sg * alpha + dg * (1 - alpha) b = sb * alpha + db * (1 - alpha) ' Worksheets(color_buffer).Cells(y, x).interior.color = RGB(r, g, b) DrawPixelWithAlpha C = C src α src + C dst (1 α src ) DrawTriangleWithAlpha C dst C src src C 6.5 '' 2
Sub DrawTriangleWithAlpha(x0, y0, x1, y1, x2, y2, a, r, g, b) ' Dim xmin(256) As Integer Dim xmax(256) As Integer Scanline x0, y0, x1, y1, xmin, xmax Scanline x1, y1, x2, y2, xmin, xmax Scanline x2, y2, x0, y0, xmin, xmax ' ymin = WorksheetFunction.Min(y0, y1, y2) ymax = WorksheetFunction.Max(y0, y1, y2) For y = ymin To ymax For x = xmin(y) To xmax(y) DrawPixelWithAlpha x, y, a, r, g, b Next x Next y DrawTriangleWithAlpha ( 6.6) Main_DrawTetraHedron WithAlpha '' Sub Main_DrawTetrahedronWithAlpha() ' 2 BackBufferID = 2 color_buffer1 = ColorBufferSheetname + CStr(1) color_buffer2 = ColorBufferSheetname + CStr(2) depth_buffer = DepthBufferSheetname CreateFrameBuffer color_buffer1, 1, 11 CreateFrameBuffer color_buffer2, 1, 11 CreateFrameBuffer depth_buffer, 1, 11 =0.5=0.5 (a) 奥から赤 青の順で描画した場合 =0.5=0.5 (b) 奥から青 赤の順で描画した場合図 6.6 半透明三角形パッチの描画順序 50 20 ClearFrameBuffer color_buffer1 ClearFrameBuffer color_buffer2 ClearDepthBuffer depth_buffer ' Worksheets("Transformation").Range("C5").Value = Worksheets("Transformation").Range("D5").Value = ' Dim TriangleID(4) TriangleID(1) = 4 TriangleID(2) = 2 TriangleID(3) = 1 TriangleID(4) = 3 6.7 Excel 6.7.1 x 50 y 20 3 ' Dim alpha(4) alpha(1) = 0.8 alpha(2) = 0.6 alpha(3) = 0.7 alpha(4) = 0.9 ' For i = 1 To 4 Set Triangle = Range("Connections").Rows(TriangleID(i)) ' 1
index1 = Triangle.Cells(1, 1) x1 = Round(Range("ProjectedVertices").Cells(index1, 1)) y1 = Round(Range("ProjectedVertices").Cells(index1, 2)) ' 2 index2 = Triangle.Cells(1, 2) x2 = Round(Range("ProjectedVertices").Cells(index2, 1)) y2 = Round(Range("ProjectedVertices").Cells(index2, 2)) ' 3 index3 = Triangle.Cells(1, 3) x3 = Round(Range("ProjectedVertices").Cells(index3, 1)) y3 = Round(Range("ProjectedVertices").Cells(index3, 2)) ' r = Range("Colors").Cells(TriangleID(i), 1) g = Range("Colors").Cells(TriangleID(i), 2) b = Range("Colors").Cells(TriangleID(i), 3) ' a = alpha(triangleid(i)) r, g, b ' DrawTriangleWithAlpha x1, y1, x2, y2, x3, y3, a, ' DrawLine x1, y1, x2, y2, 0, 0, 0 DrawLine x2, y2, x3, y3, 0, 0, 0 DrawLine x3, y3, x1, y1, 0, 0, 0 Next Excel,, (2011 ) 4
課題 CG 6 25 17 6 6 ExcelCG CG 3.1.xls CG 5