传奇绘图更换笔记:ZenGL 一些需要注意的事情

编程入门 行业动态 更新时间:2024-10-26 10:34:45

传奇绘图更换笔记:ZenGL 一些<a href=https://www.elefans.com/category/jswz/34/1766924.html style=需要注意的事情"/>

传奇绘图更换笔记:ZenGL 一些需要注意的事情

ZenGL 的颜色位序 为文档中说明为 TEX_RGBA 但实际在Delphi 为ABGR 这或许是因为Opengl 的端序和Delphi 下不太一致。

fx _setColor 这个函数却不是使用ABGR  而是实在的RGBA  导致我在将传奇客户端改为Zengl 迷糊了很久。但是其实可以将其颜色位序设置为GL_BGRA_EXT 这样可以做到兼容DIB位图。不过Zengl的OpenGLALL单元并没有提供常亮声明。最终我在GLScene的头文件内找到了 

[delphi]  view plain copy
  1. // PixelFormat  
  2. GL_RGB                            = $1907;  
  3. GL_RGBA                           = $1908;  
  4. GL_BGRA_EXT                       = $80E1;  

将其声明 试了有效,

而且Zengl提供的混合模式是在是少的可怜。Src_ColorAdd的特效也没有内置 最后还是从HGE内抄过来用。


另外ZenGL并没有提供黑白效果。 作者说要么在加载纹理的时候将其设置为 TEX_GRAYSCALE  要么自己GetData SetData处理。

这可如何是好这样当玩家死了 那我灰白界面不是绘制不出来了么。。。

也罢 最终自己从网上扒到图片黑白化的原理 自己实现之 。因为GetData SetData 导致其效率明显低了很多。

[delphi]  view plain copy
  1. procedure TTexture.GrayScale;  
  2. var  
  3.   PP:PByteArray;  
  4.   PPixel : PCardinal;  
  5.   nLen:Integer;  
  6.   Pixel:Cardinal;  
  7.   R,G,B:Byte;  
  8.   I:integer;  
  9. begin  
  10.   tex_GetData(Surface,PP);  
  11.   PPixel := PCardinal(PP);  
  12.   nLen := GetRealHeight * GetRealWidth;  
  13.   { 
  14. 灰度处理一般有三种算法: 
  15. 1 最大值法:即新的颜色值R=G=B=Max(R,G,B),这种方法处理后的图片看起来亮度值偏高。 
  16. 2 平均值法:即新的颜色值R=G=B=(R+G+B)/3,这样处理的图片十分柔和 
  17. 3 加权平均值法:即新的颜色值R=G=B=(R * Wr+G*Wg+B*Wb),一般由于人眼对不同颜色的敏感度不一样, 
  18. 所以三种颜色值的权重不一样,一般来说绿色最高,红色其次,蓝色最低,最合理的取值分别为Wr = 30%,Wg = 59%,Wb = 11% 
  19. }  
  20.   //这里使用的是第3总算法  
  21.   for i := 0 to nLen - 1 do  
  22.   begin  
  23.     Pixel := PPixel^;  
  24.     R := Pixel and $FF;  
  25.     G := (Pixel shr 8) and $FF;  
  26.     B := (Pixel shr 16) and $FF;  
  27.   
  28.     R := Trunc(R * 0.3);  
  29.     G := Trunc(G * 0.59);  
  30.     B := Trunc(G * 0.11);  
  31.       
  32.     R:= (R + G + B);  
  33.   
  34.     PPixel^ := $FF000000 or (R) or (R shl 8) or (R shl 16);  
  35.     Inc(PPixel);  
  36.   end;   
  37.     
  38.   tex_SetData(Surface,PP,0,0,GetRealWidth,Surface.Height);  
  39.   FreeMem(PP);  


另外关于黑夜效果的实现:

传奇原来的黑夜效果 我没太仔细看。是类似掩码的方式进行 对于不同的亮度有不同的掩码数据 对坐标的色彩进行运算。而且写的是汇编 比较高深。

这里我为了实现这种光效 参考的是HGE内DynamicLight 的例子 将其移至到Zengl并且工作。

1.需要一张和屏幕纹理一样大的 光效层。

2.将其Fill为 ARGB(Light,Light,Light,Light) 这个light 是Byte分量的亮度。

3.使用一张光效遮罩


4。使用Src_ColorAdd混合模式  将其绘制在光效层上 

[delphi]  view plain copy
  1. srcBlend := GL_DST_ALPHA;  
  2. dstBlend := GL_SRC_COLOR;   



5.使用Multiply 混合模式将光效会在目标层上。

[delphi]  view plain copy
  1. srcBlend := GL_ZERO;  
  2. dstBlend := GL_SRC_COLOR  

最终效果是这样的:



最后对ZenGL做一些总结.

使用很方便 而且跨平台 效率也还不错  但是功能并不是太完善。比如 我需要获得纹理某个像素点 的像素 这种功能并没有实现 智能获取渲染目标的某个点 并且这个函数在全屏下还有问题。 目前我使用的是GetData,但是GetData 一下要拷贝所有像素(效率低)。如果要优化只能自己去学习Opengl相关的API。封装的不算很好。

而且像素格式 Zengl源码内只实现了一种RGBA  虽然可以像我前面说的  改为ARGB 以便兼容DIB 但是Zengl本身并没有提供。

对Png图片纹理载入未完善。 png的图片对透明通道的载入 只支持8bit的 其他的一律不行。

最后:在实际折腾了半个月后 真新感觉  Opengl的优势就是跨平台,真心不如DX好用.

如果再让我在ZenGL和Hge中选择的话  如果是改传奇绘图 我会用HGE  如果搞新项目 我会用ZenGL 

更多推荐

传奇绘图更换笔记:ZenGL 一些需要注意的事情

本文发布于:2024-02-11 07:22:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1679819.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:需要注意   事情   笔记   传奇   ZenGL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!