【问题标题】:Render to a texture, then render result to screen in OpenGL渲染到纹理,然后在 OpenGL 中将结果渲染到屏幕
【发布时间】:2012-09-11 19:51:37
【问题描述】:

我需要将 OpenGL 场景渲染为纹理,然后才能在着色器中操作该纹理。我已经通过使用 Framebuffer Objects 解决了这个问题,我想我现在已经很好地理解了。在我的效果管道中的许多地方,我需要渲染一个全屏四边形并使用动态渲染的纹理对其进行纹理处理,这就是我的问题所在。

这是我的场景的样子:https://www.mathematik.uni-marburg.de/~thomak/planet.jpg

我将其渲染为纹理并将该纹理映射到全屏四边形。但是,生成的图像以这种方式失真:https://www.mathematik.uni-marburg.de/~thomak/planettexture.jpg

这里是渲染四边形和设置纹理坐标的代码:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glBegin(GL_QUADS);

glTexCoord2i(0, 0);
glVertex3i(-1, -1, -1);    
glTexCoord2i(0, 1);
glVertex3i( 1, -1, -1); 
glTexCoord2i(1, 1);   
glVertex3i( 1,  1, -1); 
glTexCoord2i(1, 0);   
glVertex3i(-1,  1, -1);

glEnd();
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();

着色器代码在这里:

sampler2D BlitSamp = sampler_state
{
  MinFilter = LINEAR;
  MagFilter = LINEAR;
  MipFilter = LINEAR;
  AddressU = Clamp;
  AddressV = Clamp;
};

float4 AlphaClearPS(float2 texcoords : TEXCOORD0) : COLOR
{
  return float4(tex2D(BlitSamp, texcoords).rgb, 1.0f);
}

其中 BlitSamp 是我渲染到然后传递给着色器的纹理。这里会发生什么?

【问题讨论】:

    标签: c++ opengl shader textures


    【解决方案1】:

    您的 tex 坐标可能已关闭。你的代码,我的 cmets:

    glTexCoord2i(0, 0);     //Bottom-Left
    glVertex3i(-1, -1, -1); //Bottom-Left    
    
    glTexCoord2i(0, 1);     //Top-Left
    glVertex3i( 1, -1, -1); //Bottom-Right??? 
    
    glTexCoord2i(1, 1);     //Top-Right
    glVertex3i( 1,  1, -1); //Top-Right
    
    glTexCoord2i(1, 0);     //Bottom-Right
    glVertex3i(-1,  1, -1); //Bottom-Left??
    

    【讨论】:

    • 谢谢,你说得对!我基本上是将 Direct3D 应用程序移植到 OpenGL 并且不知道他们不同意 UV 空间的起源的事实......我知道它在 Direct3D 中是左上角,那么它在 OpenGL 中是左下角吗?跨度>
    • 它们在 OpenGL 中通常位于左下角,是的。很高兴为您提供帮助!
    【解决方案2】:

    渲染四边形的代码看起来不错,这表明四边形的大小和视口的大小不匹配。

    您是否可以在创建渲染纹理时交换宽度和高度?

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2014-08-12
      • 2023-03-30
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多