【发布时间】:2015-01-22 19:00:33
【问题描述】:
我希望能够(在片段着色器中)将一个纹理添加到另一个纹理。现在我有投影纹理并想扩展它。
我还绘制了视锥体,蓝色/灰色测试图像沿着该视锥体投影到不断旋转的几何体上。
我的顶点着色器:
ProjTexCoord = ProjectorMatrix * ModelTransform * raw_pos;
我的片段着色器:
vec4 diffuse = texture(texture1, vs_st);
vec4 projTexColor = textureProj(texture2, ProjTexCoord);
vec4 shaded = diffuse; // max(intensity * diffuse, ambient); -- no shadows for now
if (ProjTexCoord[0] > 0.0 ||
ProjTexCoord[1] > 0.0 ||
ProjTexCoord[0] < ProjTexCoord[2] ||
ProjTexCoord[1] < ProjTexCoord[2]){
diffuse = shaded;
}else if(dot(n, projector_aim) < 0 ){
diffuse = projTexColor;
}else{
diffuse = shaded;
}
我想要达到的目标:
例如,当用户按下按钮时,我希望将蓝色/灰色纹理写入球体上的灰色纹理并随其旋转。将其想象为“拍照”或在球体顶部绘画,以便在按下按钮后蓝色/灰色纹理随球体旋转。
由于片段着色器对每个像素进行操作,因此应该可以将一个像素一个像素地从一个纹理复制到另一个纹理,但我不知道怎么做,我可能在谷歌上搜索错误的东西。
我如何在技术上实现这一目标?什么方法最通用?非常感谢您的建议,如果需要更多代码,请告诉我。
【问题讨论】:
-
帧缓冲对象是不是你想要的? songho.ca/opengl/gl_fbo.html
-
@MorphingDragon 我以前从未使用过 FBO。那么这个想法是FBO成为球体的最终输出纹理?有点像我不断修改的缓存纹理?
-
差不多。无论如何,这将是唯一的 GPU 路线。
-
对于从纹理到纹理的直接复制,您可以使用
glBlitFramebuffer()。否则,将目标纹理设置为 FBO 附件,并对其进行渲染。
标签: c++ opengl glsl texture-mapping render-to-texture