【问题标题】:OpenGL Texture Projection Go Through SurfaceOpenGL 纹理投影通过表面
【发布时间】:2017-07-03 08:28:31
【问题描述】:

我是新来的,我也是 openGL 的新手。我想开发某种查看器,它可以加载 .ply 文件、图像作为纹理,并将其投影到网格中。我想问一下纹理投影。加载纹理和设置纹理投影的代码如下:

def loadTexture():
   # load the image
   imdata = 0
   imname = 'Cropped_Image26904_2.jpg'
   texture = glGenTextures(1)
   im = cv2.imread(imname)
   imdata = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
   # bind texture
   glBindTexture(GL_TEXTURE_2D, texture)
   glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, imdata.shape[1],
   imdata.shape[0], 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, imdata)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
   GL_CLAMP_TO_BORDER)
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
   GL_CLAMP_TO_BORDER)
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
   GL_CLAMP_TO_BORDER)
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
   GL_CLAMP_TO_BORDER)
   gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, imdata.shape[1], 
   imdata.shape[0], GL_RGB, GL_UNSIGNED_BYTE, imdata)
   # set the 'projector' location that project the texture
   glMatrixMode(GL_PROJECTION)
   glPushMatrix()
   glLoadIdentity()
   gluPerspective(fov, 
   float(glutGet(GLUT_WINDOW_WIDTH))/glutGet(GLUT_WINDOW_HEIGHT), .1, 
   1e8)
   gluLookAt(0,0,1, 0,0,0, 0,1,0)
   mat3 = glGetFloatv(GL_PROJECTION_MATRIX)
   # mapping the texture
   glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)
   glTexGenfv(GL_S, GL_EYE_PLANE, mat3[0])
   glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)
   glTexGenfv(GL_T, GL_EYE_PLANE, mat3[1])
   glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)
   glTexGenfv(GL_R, GL_EYE_PLANE, mat3[2])
   glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)
   glTexGenfv(GL_Q, GL_EYE_PLANE, mat3[3])
   # enable the texture
   glEnable(GL_TEXTURE_2D)
   glEnable(GL_TEXTURE_GEN_S)
   glEnable(GL_TEXTURE_GEN_T)
   glEnable(GL_TEXTURE_GEN_R)
   glEnable(GL_TEXTURE_GEN_Q)

这个在某种程度上可以正常工作。这是它的截图: The viewer form front. The pink ball is the 'projector' position

问题是投影的纹理穿过了盒子并且还在盒子的背面留下了投影: The texture also projected to the backside of the cube

那么,问题来了,如何让纹理的投影只出现在“投影仪”可见的面上?非常感谢。

【问题讨论】:

    标签: python opengl textures projection


    【解决方案1】:

    那么,问题来了,如何让纹理的投影只出现在“投影仪”可见的面上?非常感谢。

    在绘制盒子的背面时禁用纹理。

    或者您希望盒子上出现阴影? OpenGL 不是在整个场景上运行的全局照明渲染器。事实上,OpenGL 只是一支美化的铅笔,一次绘制一个点、线或三角形,它们之间没有任何交互,除了它们对帧缓冲区中像素值的影响。

    【讨论】:

    • 你好 datenwolf,谢谢你的回答。我在glDisable(GL_TEXTURE_2D) 绘制立方体之前尝试了禁用纹理的解决方案,但生成的渲染是这样的:imgur.com/kYjoz9K 我有什么遗漏的吗?
    • @ResindraAji:对不起,我在答案中遗漏了几句话:您当然只能在绘制盒子背面时禁用纹理。 或者您可以远离固定功能管道并改用着色器,实际上可以根据外部条件决定是否应用纹理,例如实际上指向投影仪的面。 着色器让一切变得更容易,所以你应该真正使用它们。
    • 啊,我明白了。我实际上尝试了你的解决方案,它确实有效。非常感谢你。对于这个立方体应用程序,打开和关闭纹理是可行的,因为它只有 6 个面。所以我认为对于可能包含数千张面孔的应用程序,我应该学习使用着色器。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多