红警DIY论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: k002300

一点点关于VPL-VXL的备忘

[复制链接]
 楼主| 发表于 2023-7-9 23:57:19 | 显示全部楼层
修复位置计算问题

simple vxl viewer.7z

46.61 KB, 下载次数: 55

发表于 2023-7-17 14:24:19 | 显示全部楼层
QQ图片20230717142320.gif 伽波点了个赞
发表于 2023-7-17 15:24:47 | 显示全部楼层
要是也有TS的就好了大大大大佬nb
 楼主| 发表于 2023-11-21 00:55:34 | 显示全部楼层
本帖最后由 k002300 于 2023-11-21 00:57 编辑

最近看了一下VXLSE相关的东西,还是先写在这里记录一下吧。

要使VXLSE中的渲染视图渲染起来尽量接近游戏,游戏中这种查表绘制的老方式反而需要灵活一些的管线(可以暂时理解为渲染程序),粗罗看过后,发现VXLSE 138版本中管线过老,无法完成这一任务,需要大改的可能性大;但是VXLSE 139中的管线功能是足够的。

在VXLSE 139中要让它读取VPL并正常使用,需要我们在代码中加入一些渲染步骤:
1)利用先前研究出的公式,写一个着色器程序,其利用VPL和色盘数据(作为贴图,texelFetch获取数据)找出最终颜色;
2)将整个色盘一个颜色一个像素地创建为一个256 × 1的贴图传给着色器程序(此步骤可以用代码中的TextureBankItem类辅助完成,Create一个空的,然后用LoadTexture,把色盘的颜色数组直接传进去);
3)将VPL中有用的部分(文件中第785~8976字节)一个字节一个像素地(仅有R通道)创建为一个8192 × 1的贴图传递给着色器程序(同样可以用TextureBankItem辅助完成,但是注意:上述的LoadTexture方法要求传进去的像素数据必须为R8G8B8A8的格式,因此可能需要单独给其添加一个方法,使得glTexImage2D的format参数为GL_RED);
4)将VXLSE中设置的所属色传递给着色器程序,由着色器“生成”最终的所属色颜色。

1)的大致流程:见着色器附件;
2)和3)的大致流程:
PaletteTexture: PTextureBankItem;
初始化时
   new(PaletteTexture);
   PaletteTexture^ := TTextureBankItem.Create;
加载时
         PaletteTexture^.LoadTexture(Palette^.GetColourArrayPointer,GL_RGBA8,1,256,0);
         CurrentPaletteTexture := PaletteTexture;
         glBindTexture(GL_TEXTURE_2D, PaletteTexture^.GetID);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
         glBindTexture(GL_TEXTURE_2D, 0);
GetColourArrayPointer方法是我加上去的,只要返回FPalette首地址就行;VPL贴图差不多,就是大小和格式(GL_R8),但是对于注意事项中所提及的问题,我在UploadTexture中做出了修改:
if(_Format = GL_R8) then
   begin
    glTexImage2D(GL_TEXTURE_2D, _Level, _Format, _Width, _Height, 0, GL_RED, GL_UNSIGNED_BYTE, _Data);
   end
   else
    glTexImage2D(GL_TEXTURE_2D, _Level, _Format, _Width, _Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, _Data);
   begin
   end;
原本只有下面的情况,但我单独特化了,我个人并不认为这是一个好的做法;
传递给着色器:我临时写在PreRender里了(VXL用的Geometry类在VXLSE中为MeshBRepGeometry):
if(CurrentPaletteTexture <> nil) then
            begin      
              PalTexID := CurrentPaletteTexture^.GetID;
              glEnable(GL_TEXTURE_2D);  
              glActiveTexture(GL_TEXTURE1);
              glBindTexture(GL_TEXTURE_2D, PalTexID);
              glUniform1i(glGetUniformLocation(ShaderProgram, 'paletteBuffer'), 1);
            end;

传递所属色:
              glUniform3f(glGetUniformLocation(ShaderProgram, 'remapColour'), (CurrentFactionColor and $FF), (CurrentFactionColor shr 8) and $FF, (CurrentFactionColor shr 16) and $FF);
CurrentFactionColor为TColor类型,因此需要像代码中那样取出RGB来;着色器读到的所属色颜色值为0~255而不是0~1,可以在此处手动除一个255.0;

※游戏如何计算所属色在着色器中也有体现。

效果的话大致如gif图所示;


素材来源:
https://bbs.ra2diy.com/forum.php?mod=viewthread&tid=22283   
@2244106363
mammoth_000.gif

shaders.7z

1.14 KB, 下载次数: 9

发表于 2023-11-21 14:47:43 | 显示全部楼层
强!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|手机版|管理员邮箱|红警DIY官方论坛

GMT+8, 2024-4-17 21:30 , Processed in 0.056870 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表