我有两个.png格式的纹理(地板和墙),我在初始化时加载它们,并在渲染之前选择glBindTexture
,但是我得到了:
screen_shot_1
而不是这样:
screen_shot_2
初始化:
def __init__(self, screen_info, wall_number):
self.screen = screen_info
self.inscription = font.Font(get_path([RES_PATH[0], 'font', 'main.ttf']), 12)
self.path = get_path([RES_PATH[0], RES_PATH[1], ''])
self.sprite_list = {}
self.tex_list = {}
self.generate_list()
self.wall_coordinates = []
self.wall_number = wall_number
self.wall_counter = 0
glClearColor(*BACKGROUND_COLOR)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(FOV, self.screen.current_w / self.screen.current_h, DISTANCE_NEAR, DISTANCE_FAR)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glEnable(GL_DEPTH_TEST)
glEnable(GL_TEXTURE_2D)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
主回路:
^{pr2}$纹理加载程序:
def load_tex(self, filename, rotate=False, text_render=False, text=''):
if not text_render:
surface = image.load(filename)
if rotate:
surface = transform.rotate(surface, 180)
else:
surface = self.inscription.render(str(text), 1, (255, 255, 255), (0, 0, 0))
surface = transform.scale(surface, (64, 64))
surface = transform.rotate(surface, 180)
size = surface.get_size()
surface = image.tostring(surface, 'RGB', True)
texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texture)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
glTexImage2D(GL_TEXTURE_2D, 0, 3, size[0], size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, surface)
return texture
初始化期间加载纹理:
def generate_list(self):
for filename in listdir(self.path):
self.tex_list[filename] = self.load_tex(get_path([RES_PATH[0], RES_PATH[1], filename]))
绘图地:
def draw_ground(self, x, z, length=50):
glBindTexture(GL_TEXTURE_2D, self.tex_list['floor.png'])
# glBindTexture(GL_TEXTURE_2D, self.load_tex(get_path([RES_PATH[0], RES_PATH[1], 'floor.png'])))
glBegin(GL_QUADS)
glTexCoord2f(0, length)
glVertex3f(x - length, -0.5, z + length)
glTexCoord2f(length, length)
glVertex3f(x + length, -0.5, z + length)
glTexCoord2f(length, 0)
glVertex3f(x + length, -0.5, z - length)
glTexCoord2f(0, 0)
glVertex3f(x - length, -0.5, z - length)
glEnd()
绘制墙:
def draw_square(self, x, y, z, length=2, rot=False):
glBindTexture(GL_TEXTURE_2D, self.tex_list['wall.png'])
# glBindTexture(GL_TEXTURE_2D, self.load_tex(get_path([RES_PATH[0], RES_PATH[1], 'wall.png'])))
glBegin(GL_QUADS)
glTexCoord2f(0, 1)
glVertex3f(x, y, z)
glTexCoord2f(1, 1)
if not rot:
glVertex3f(x + length, y, z)
glTexCoord2f(1, 0)
glVertex3f(x + length, y - length, z)
else:
glVertex3f(x, y, z + length)
glTexCoord2f(1, 0)
glVertex3f(x, y - length, z + length)
glTexCoord2f(0, 0)
glVertex3f(x, y - length, z)
glEnd()
那么问题是什么呢?在
我在你的代码中注意到了一些可能与你的纹理问题无关的事情:
下面是我用pyopengl和pygame制作的一个简单的演示。它渲染两个二维正方形,每个具有不同的纹理。结构和U是重要的功能部件,而载荷是主要部件:
顺便说一句,您的代码和我发布的演示代码在现代OpenGL中都是不推荐使用的,它不支持glBegin和glEnd这样的慢速即时模式调用。如果以后遇到性能问题,可能需要考虑重构以使用更现代的技术,如vbo(顶点缓冲对象)。但对于简单的应用程序,这应该不是一个太大的问题。让我知道如果这有帮助!在
相关问题 更多 >
编程相关推荐