基于optix的习惯化渲染

该博客探讨了一种基于人眼观察习惯的渲染优化技术。通过在第一帧检测物体可见性,当物体存在超过6秒时,降低其渲染密度(只投射一半光线)。当物体再次出现,逐渐增加射线追踪数量。实现中使用C++和Optix,通过GPU与CPU的数据交互判断物体可见性并调整射线追踪数目,以此模拟视觉习惯效果。
摘要由CSDN通过智能技术生成

当一个物体存在于视线当中发一定的时间,人眼就会减少对它的观察,根据这个原理来渲染物体。

首先在第一帧检测物体是否可见,然后当物体存在的帧数大于6秒,就对他进行一半的渲染,也就是投射一半的光线。当物体消失在视野之后,再次见到,就对他进行16个射线追踪,根据时间依次递减。

主要的操作就是,在host端的一帧结束之后,给每个物体标号,依次判断物体可见性,依次叠加每个物体存在的帧数(也就是时间)。建立了一个buffer(用于gpu和cpu的数据交互),只要在cu端(也就是gpu)执行了添加纹理的函数,(也就是对某个物体添加纹理了-所以这个物体肯定是可见的),那么对buffer修改,返回到cpu,加帧数,修改在该物体的射线数,再将buffer恢复为0(clear缓冲区)。如果没有执行添加纹理的函数,说明不可见,那么buffer肯定还是0,则将射线恢复为16。这里再cu文件的phonle针孔相机里面执行射线数的操作,首先要做的就是检测这条射线是否是相交于该物体。

c++文件:

double t1,t2 ;
//int  Z;
//int E = 0;//重要性
void glutDisplay()
{
    clock_t start_time = clock();
    updateCamera();

    context->launch(0, width, height);

    //    glGenQueries(GLsizei n, GLuint * ids);
    Buffer buffer = getOutputBuffer();
    
    //clock_t start_time = clock();
    
    Buffer erzhi_buffer = getOutputBuffer1();
    //Buffer new_buffer = context["erzhi_buffer"]->getBuffer();
    


    sutil::displayBufferGL(getOutputBuffer());
    clock_t end_time = clock();
    

    //cout << t << endl;

    GLvoid * abc;
    abc = erzhi_buffer->map(0, RT_BUFFER_MAP_READ_WRITE);
    int* result = (int *)abc;
    erzhi_buffer->unmap();
    if (*result == 88888)
    {
        t1 += (double)(end_time - start_time) / CLOCKS_PER_SEC;
        zhen = zhen + 1;
        E = max(int((((exp)(-t1 * t1 / 8 / 8)) * 20 / 8 / (sqrt(2 * 3.1415))) * 16), 8);
        cout << E << endl;
    }
    else {
        zhen = 0;
        E = 16;
        t1 = 0;
    }
    if (*(result + 1) == 77777)
    {
        t2 += (double)(end_time - start_time) / CLOCKS_PER_SEC;
        zhen1 = zhen1 + 1;
        E1 = max(int((((exp)(-t2 * t2 / 8 / 8)) * 20 / 8 / (sqrt(2 * 3.1415)))*16), 8);
    }
    else {
        zhen1 = 0;
        E1 = 16;
        t2 = 0;
    }
    //cout<<zhen<<"  " << E<<"   " <<E1<< endl;
    *result = 11;
    *(result + 1) = 0;
    *(result + 2) = 0;
    *(result + 3) = 0;
    memcpy(erzhi_buffer->map(), result, sizeof(int) * 4);
    erzhi_buffer->unmap();
    GLvoid * abcd;
    abcd = erzhi_buffer->map(0, RT_BUFFER_MAP_READ_WRITE);
    int* result1 = (int *)abcd;
    erzhi_buffer->unmap();
    context["E"]->setInt(E);
    context["E1"]->setInt(E1);

    

    {static unsigned frame_count = 0;

    sutil::displayFps(frame_count++);
    //Z = frame_count++;
    
    }
    
    glutSwapBuffers();

    
}
 

 

 

 

 

cu文件:

/*
 * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the follo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值