bubbbbbai 2023-11-23 15:22 采纳率: 0%
浏览 6
已结题

opencl + opengl 处理3d模型texture后,显示会是一片一片的色块

如题

opencl和opengl共享gpu 的texture,
通过cl处理3d模型的颜色

但是处理完后显示的效果很奇怪,而且模型放大才能看到处理效果

这个是.cl的代码

__kernel void hello_kernel(__read_only image2d_t intexture,__write_only image2d_t outtexture,sampler_t sampler)
{
    int x = get_global_id(0);
    int y = get_global_id(1);

    float level = 99.0f;
    float4 oldcolor = read_imagef(intexture, sampler,(int2)(x, y));
    float beta =  1 + level * (oldcolor.x + oldcolor.y + oldcolor.z) / (3 *255);

    float red = log(oldcolor.x * (beta - 1) /255 + 1) / log(beta) * 255;
    float green = log(oldcolor.y * (beta - 1) /255 + 1) / log(beta) * 255;
    float blue = log(oldcolor.z * (beta - 1) /255 + 1) / log(beta) * 255;
    float alhpa = oldcolor.w;
                
    float4 newcolor = (float4)(red, green, blue, alhpa );
    write_imagef(outtexture, (int2)(x, y), newcolor);
    
}

搞不太清楚是什么原因引起的

示意图,这个是改成黑色时的效果,不是上边代码生成的颜色

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-23 21:50
    关注

    【以下回答由 GPT 生成】

    问题是由于在处理后的颜色计算公式中使用了对数函数,这可能导致在一些颜色范围内出现不正确的结果。在这种情况下,处理后的颜色可能接近于0,使得显示为黑色。

    解决这个问题的一种方法是优化颜色计算公式,以确保处理后的颜色在正确范围内。

    以下是一个修改后的.cl代码示例:

    __kernel void hello_kernel(__read_only image2d_t intexture, __write_only image2d_t outtexture, sampler_t sampler)
    {
        int x = get_global_id(0);
        int y = get_global_id(1);
    
        float gamma = 2.2f; // 伽马矫正值
        float level = 99.0f;
    
        float4 oldcolor = read_imagef(intexture, sampler, (int2)(x, y));
        float4 newcolor;
    
        // 将颜色值从0-255范围转换到0-1范围
        float red = oldcolor.x / 255.0f;
        float green = oldcolor.y / 255.0f;
        float blue = oldcolor.z / 255.0f;
        float alpha = oldcolor.w;
    
        // gamma校正
        red = pow(red, gamma);
        green = pow(green, gamma);
        blue = pow(blue, gamma);
    
        // 调整亮度
        float intensity = (red + green + blue) / 3.0f;
        float beta = 1 + level * intensity;
    
        // 颜色映射算法
        float4 color = (float4)(red, green, blue, alpha);
        float4 mapped_color = (color*(beta-1)+(1-beta))/beta;
    
        // 伽马矫正
        mapped_color.x = pow(mapped_color.x, 1/gamma);
        mapped_color.y = pow(mapped_color.y, 1/gamma);
        mapped_color.z = pow(mapped_color.z, 1/gamma);
    
        // 将颜色值从0-1范围转换到0-255范围
        newcolor.x = mapped_color.x * 255.0f;
        newcolor.y = mapped_color.y * 255.0f;
        newcolor.z = mapped_color.z * 255.0f;
        newcolor.w = alpha;
    
        write_imagef(outtexture, (int2)(x, y), newcolor);
    }
    

    这个修改后的代码优化了颜色计算过程,包括使用正确的伽马校正和调整亮度的算法。请使用这个修改后的代码来测试是否解决了显示异常的问题。如果问题仍然存在,可能需要检查其他因素,比如模型渲染过程中的设置或其他代码中的错误。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月5日
  • 创建了问题 11月23日

悬赏问题

  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 关于移动机器人坐标计算
  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音