1、在OpenGL中生成纹理texture

  optix中的纹理直接使用OpenGL纹理的id,不能跨越OpenGL纹理,所以我们先在OpenGL环境下生成一张纹理。

  这个过程就很熟悉了:

void WKS::Texture::GenTextureFromFile(const char* name, std::string directory) {

    std::string fileName = directory + '/' + std::string(name);
int width, height, channel;
unsigned char* image = SOIL_load_image(fileName.c_str(), &width, &height, &channel, SOIL_LOAD_RGBA);
//Assign texture to ID;
glGenTextures(, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
//Parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, , GL_RGBA32F, width, height, , GL_RGBA, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, );
SOIL_free_image_data(image);
}

  这个本来很简单,但是我在这儿遇到了一个错误,将此生成的纹理放入Optix出现了错误:

  

  原因是我之前在上面红色显示的纹理格式处使用的 GL_RGB,这样写在OpenGL中毫无问题,但是引入Optix中出现了上图错误,耽搁了很长时间。

2、Optix中生成TextureSampler 对象,并绑定到Program中

  生成TextureSampler 对象:

OptixTexture(optix::Context& context, GLuint texid) {
textureSampler = context->createTextureSamplerFromGLImage(texid, RT_TARGET_GL_TEXTURE_2D);
textureSampler->setWrapMode(, RT_WRAP_CLAMP_TO_EDGE);
textureSampler->setWrapMode(, RT_WRAP_CLAMP_TO_EDGE);
textureSampler->setIndexingMode(RT_TEXTURE_INDEX_ARRAY_INDEX);
textureSampler->setReadMode(RT_TEXTURE_READ_ELEMENT_TYPE);
textureSampler->setMaxAnisotropy(1.0f);
textureSampler->setFilteringModes(RT_FILTER_NEAREST, RT_FILTER_NEAREST, RT_FILTER_NONE);
}

  绑定到Program中:

void BindSampler(optix::Context& context, const char* target) {
context[target]->setTextureSampler(this->textureSampler);
}

  Host中的调用方式:

this->tex_wall = new WKS::Texture("back.jpg", "source/texture/skybox");
this->optixTexture = new OptixTexture(context, tex_wall->GetTextureID());
this->optixTexture->BindSampler(context, "tex_wall");

3、Program 中的纹理使用(纹理访问)

  输入声明:

//输入纹理
rtTextureSampler<float4, > tex_wall;

  访问:

float4 color = tex2D(tex_wall, launch_index.x*1.0f/screen.x, 1.0f-launch_index.y*1.0f/screen.y);

效果:(输入一张图,显示出来)

最新文章

  1. 使用github之前的技能准备
  2. centos 常见软件安装
  3. Dijkstra算法(一)之 C语言详解
  4. rh6安装oracle11g+ASM
  5. linux 下vim的使用
  6. BIEE 配置邮箱服务器
  7. TCP segment of a reassembled PDU
  8. 趣味Python入门(一):初识Python
  9. winscp配置
  10. React Native在虚拟运行app时,报错RCTRootView not found,怎么解决?
  11. -_-#【事件】keyCode
  12. ddraw 视频下画图 不闪烁的方法
  13. PowerDesigner如何把建好的表导入到数据库中,并且把注释也导入进去
  14. 漏洞预警 | Apache Struts2 曝任意代码执行漏洞 (S2-045)
  15. linux下mysql修改root密码
  16. python 三级菜单 while循环三次,湖北省市-县-街道的选择,3个while的循环 -day2
  17. GCD之信号量机制二
  18. BPM如何选型?
  19. ViewParent 和 ViewManager
  20. js动态修改title

热门文章

  1. JQuery之Ajax基础
  2. css position:sticky的尝试
  3. C语言入门-全局变量
  4. 12c新特性 在线操作数据文件
  5. Java8特性
  6. uiautomatorviewer 报错 Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn&#39;t exist!
  7. APScheduler学习
  8. YAPI windows 二次开发 树形结构 多层级结构 拖拽 数据导入 接口自动化测试
  9. Spring Boot AOP解析
  10. three.js通过canvas实现球体世界平面地图