2017-07-03 78 views
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

所以,問題是,如何使紋理的投影僅出現在「投影機」可見的面上?非常感謝你。

回答

1

所以,問題是,如何使投影紋理只出現在「投影機」可見的面上?非常感謝你。

在繪製框的背面時禁用紋理。

或者您是否期望箱子上出現陰影? OpenGL不是一個在整個場景上運行的全局照明渲染器。實際上,OpenGL只是一個美化的鉛筆,一次只繪製一個點,線條或三角形,除了它們對幀緩衝區中像素值的影響之外,每個線條之間沒有任何交互作用。

+0

Hey datenwolf,謝謝你的回答。我在通過'glDisable(GL_TEXTURE_2D)'繪製多維數據集之前嘗試了禁用紋理的解決方案,但生成的渲染如下所示:http://imgur.com/kYjoz9K 有什麼我缺少的東西? –

+0

@ResindraAji:對不起,我在答案中遺漏了幾句話:當然,只有在繪製盒子背面時才能禁用紋理。 *或者你可以從固定功能流水線移開並使用着色器,而實際上可以根據外部標準決定是否應用紋理,例如實際上是指向投影機的面部。*着色器使*所有內容更容易,所以你應該真的使用它們。 – datenwolf

+0

啊我明白了。我實際上已經嘗試過你的解決方案,它確實有效。非常感謝你。對於這個多維數據集應用程序,打開和關閉紋理是可行的,因爲它只有6面。所以我認爲我的應用可能包含數千張面孔,我應該學習使用着色器。非常感謝你。 –