Prechádzať zdrojové kódy

feat: 添加图片透明度设置

nicetry12138 1 rok pred
rodič
commit
ab34f0cc80

BIN
OpenGL/Image/024.png


+ 17 - 0
OpenGL/README.md

@@ -1007,5 +1007,22 @@ drawPoint(Point(inX + u, inY + v, finalColor));
 | --- | --- |
 | ![](Image/022.png) | ![](Image/023.png) |
 
+可以发现衣服边缘锯齿突刺明显减少,边缘过度更加平滑
+
+### 图片透明度和玻璃效果
+
+一般来说不会直接设置图片的透明度,而是设置一个 `Sprite` 的透明度,在计算的时候会根据 `Sprite` 的透明度和像素的透明度算出真正的透明度,不过这里不封装 `Sprite` 了,简单粗暴将图片的透明度放在 `Image` 中
+
+```cpp
+float alpha = (float)srcColor.m_a / 255.0f * inImage->getAlpha();
+RGBA finalColor = colorLerp(dstColor, srcColor, alpha);
+```
+
+只需要在绘制的时候,将图片的 alpha 值乘以像素的 alpha 值即可
+
+$\alpha_{\text{final}} = \alpha_{\text{global}} \times \alpha_{\text{pixel}}$
+
+![](Image/024.png)
+
 ## 图形学状态机接口封装
 

+ 2 - 1
OpenGL/src/WindowsProjectTest/WindowsProjectTest/Canvas.cpp

@@ -307,7 +307,8 @@ namespace GT {
 				}
 				else {
 					RGBA dstColor = getColor(inX + u, inY + v);
-					RGBA finalColor = colorLerp(dstColor, srcColor, srcColor.m_a / 255.0f);
+					float alpha = (float)srcColor.m_a / 255.0f * inImage->getAlpha();
+					RGBA finalColor = colorLerp(dstColor, srcColor, alpha);
 					drawPoint(Point(inX + u, inY + v, finalColor));
 				}
 			}

BIN
OpenGL/src/WindowsProjectTest/WindowsProjectTest/Image.h


+ 1 - 1
OpenGL/src/WindowsProjectTest/WindowsProjectTest/WindowsProjectTest.cpp

@@ -114,8 +114,8 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
 	/*===========创建绘图用的位图========*/
 
 	_canvas = new GT::Canvas(wWidth, wHeight, buffer);
-    _canvas->setAlphaLimit(0);
 	_image = GT::Image::readFromFile("res/carma.png");
+    _image->setAlpha(.3f);
     _bgImage = GT::Image::readFromFile("res/bk.jpg");
 	//_zoomImage = GT::Image::zoomImage(_image, 3, 3);
 	//_zoomImageSimple = GT::Image::zoomImageSimple(_image, 3, 3);