Проекция текстуры OpenGL проходит сквозь поверхность
Я новичок здесь, и я также новичок в 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)
Этот работает хорошо в некоторой степени. Вот скриншоты этого: Зритель формирует фронт. Розовый шар - это позиция "проектора"
Проблема в том, что проецируемая текстура прошла через рамку и также оставила проекцию на обратной стороне рамки: текстура также проецировалась на обратную сторону куба
Итак, вопрос в том, как сделать так, чтобы проекция текстуры появлялась только на лице, которое видно "проектору"? Большое спасибо.
1 ответ
Итак, вопрос в том, как сделать так, чтобы проекция текстуры появлялась только на лице, которое видно "проектору"? Большое спасибо.
Отключите текстуру при рисовании обратной стороны коробки.
Или вы ожидаете, что тень появится на коробке? OpenGL не является средством визуализации глобального освещения, которое работает на всей сцене. На самом деле OpenGL - это просто прославленный карандаш, который рисует отдельные точки, линии или треугольники, по одному, без какого-либо взаимодействия между ними, за исключением влияния, которое они оказывают на значения пикселей в буфере кадров.