0
我是新來的,我也是新來的openGL。我想開發某種瀏覽器,它將.ply文件,圖像加載爲紋理,並將其投影到網格中。我想問一下紋理投影。加載紋理的代碼和設置紋理的投影可以看到以下波紋:OpenGL紋理投影穿過表面
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
所以,問題是,如何使紋理的投影僅出現在「投影機」可見的面上?非常感謝你。
Hey datenwolf,謝謝你的回答。我在通過'glDisable(GL_TEXTURE_2D)'繪製多維數據集之前嘗試了禁用紋理的解決方案,但生成的渲染如下所示:http://imgur.com/kYjoz9K 有什麼我缺少的東西? –
@ResindraAji:對不起,我在答案中遺漏了幾句話:當然,只有在繪製盒子背面時才能禁用紋理。 *或者你可以從固定功能流水線移開並使用着色器,而實際上可以根據外部標準決定是否應用紋理,例如實際上是指向投影機的面部。*着色器使*所有內容更容易,所以你應該真的使用它們。 – datenwolf
啊我明白了。我實際上已經嘗試過你的解決方案,它確實有效。非常感謝你。對於這個多維數據集應用程序,打開和關閉紋理是可行的,因爲它只有6面。所以我認爲我的應用可能包含數千張面孔,我應該學習使用着色器。非常感謝你。 –