给出以下片段:
import os
import textwrap
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PIL import Image
from OpenGL.GL.ARB.multitexture import *
from OpenGL.extensions import alternate
def get_opengl_info():
return textwrap.dedent("""\
Vendor: {0}
Renderer: {1}
OpenGL Version: {2}
Shader Version: {3}
{4:*^80}
Num Extensions: {5}
{6}
""").format(
glGetString(GL_VENDOR).decode("utf-8"),
glGetString(GL_RENDERER).decode("utf-8"),
glGetString(GL_VERSION).decode("utf-8"),
glGetString(GL_SHADING_LANGUAGE_VERSION).decode("utf-8"),
"OPENGL EXTENSIONS",
glGetIntegerv(GL_NUM_EXTENSIONS),
"\n".join(glGetString(GL_EXTENSIONS).decode("utf-8").split())
)
def create_gl_texture(use_active_texture, channel, width, height, pbits):
id_texture = glGenTextures(1)
if use_active_texture:
glActiveTexture(GL_TEXTURE0 + channel)
glBindTexture(GL_TEXTURE_2D, id_texture)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, pbits)
glTexParameter(
GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameter(
GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glGenerateMipmap(GL_TEXTURE_2D)
return id_texture
def load_texture(use_active_texture, filename, i):
image = Image.open(filename)
ix = image.size[0]
iy = image.size[1]
pbits = image.convert("RGBA").tobytes("raw", "RGBA")
id_texture = create_gl_texture(use_active_texture, i, ix, iy, pbits)
print("Loaded", id_texture)
return id_texture
X_AXIS = 0.0
Y_AXIS = 0.0
Z_AXIS = 0.0
DIRECTION = 1
id_textures = []
def init_gl(Width, Height):
global glMultiTexCoord2f, glActiveTexture
print(get_opengl_info())
print("Choosing between: ", glMultiTexCoord2f.__name__,
glMultiTexCoord2fARB.__name__)
print("Choosing between: ", glActiveTexture.__name__,
glActiveTextureARB.__name__)
glMultiTexCoord2f = alternate(
glMultiTexCoord2f,
glMultiTexCoord2fARB
)
glActiveTexture = alternate(
glActiveTexture,
glActiveTextureARB,
)
print("Selected: ", glMultiTexCoord2f.__name__)
print("Selected: ", glActiveTexture.__name__)
if not glMultiTexCoord2f:
print('Multitexture not supported!')
sys.exit(1)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_SMOOTH)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(Width) / float(Height), 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
glEnable(GL_TEXTURE_2D)
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)
def keyPressed(*args):
if args[0] == "\033":
sys.exit()
# Method0: Using glBindTexture + glTexCoord2f per face
def draw_method_0():
global X_AXIS, Y_AXIS, Z_AXIS
global DIRECTION
global id_textures
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glTranslatef(0.0, 0.0, -6.0)
glRotatef(X_AXIS, 1.0, 0.0, 0.0)
glRotatef(Y_AXIS, 0.0, 1.0, 0.0)
glRotatef(Z_AXIS, 0.0, 0.0, 1.0)
glBindTexture(GL_TEXTURE_2D, id_textures[0])
glBegin(GL_QUADS)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glEnd()
glBindTexture(GL_TEXTURE_2D, id_textures[1])
glBegin(GL_QUADS)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glEnd()
glBindTexture(GL_TEXTURE_2D, id_textures[2])
glBegin(GL_QUADS)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glEnd()
glBindTexture(GL_TEXTURE_2D, id_textures[3])
glBegin(GL_QUADS)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glEnd()
glBindTexture(GL_TEXTURE_2D, id_textures[4])
glBegin(GL_QUADS)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glEnd()
glBindTexture(GL_TEXTURE_2D, id_textures[5])
glBegin(GL_QUADS)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glEnd()
X_AXIS = X_AXIS - 0.030
Z_AXIS = Z_AXIS - 0.030
glutSwapBuffers()
# Method1: Using glActiveTexture+glBindTexture+glMultiTexCoord2f per face
def draw_method_1():
global X_AXIS, Y_AXIS, Z_AXIS
global DIRECTION
global id_textures
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glTranslatef(0.0, 0.0, -6.0)
glRotatef(X_AXIS, 1.0, 0.0, 0.0)
glRotatef(Y_AXIS, 0.0, 1.0, 0.0)
glRotatef(Z_AXIS, 0.0, 0.0, 1.0)
glActiveTexture(GL_TEXTURE0 + 0)
glBindTexture(GL_TEXTURE_2D, id_textures[0])
glBegin(GL_QUADS)
glMultiTexCoord2f(GL_TEXTURE0 + 0, 0.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 0, 1.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 0, 1.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 0, 0.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 1)
glBindTexture(GL_TEXTURE_2D, id_textures[1])
glBegin(GL_QUADS)
glMultiTexCoord2f(GL_TEXTURE0 + 1, 1.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 1, 1.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 1, 0.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 1, 0.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 2)
glBindTexture(GL_TEXTURE_2D, id_textures[2])
glBegin(GL_QUADS)
glMultiTexCoord2f(GL_TEXTURE0 + 2, 0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 2, 0.0, 0.0)
glVertex3f(-1.0, 1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 2, 1.0, 0.0)
glVertex3f(1.0, 1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 2, 1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 3)
glBindTexture(GL_TEXTURE_2D, id_textures[3])
glBegin(GL_QUADS)
glMultiTexCoord2f(GL_TEXTURE0 + 3, 1.0, 1.0)
glVertex3f(-1.0, -1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 3, 0.0, 1.0)
glVertex3f(1.0, -1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 3, 0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 3, 1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 4)
glBindTexture(GL_TEXTURE_2D, id_textures[4])
glBegin(GL_QUADS)
glMultiTexCoord2f(GL_TEXTURE0 + 4, 1.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 4, 1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 4, 0.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 4, 0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 5)
glBindTexture(GL_TEXTURE_2D, id_textures[5])
glBegin(GL_QUADS)
glMultiTexCoord2f(GL_TEXTURE0 + 5, 0.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 5, 1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 5, 1.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glMultiTexCoord2f(GL_TEXTURE0 + 5, 0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glEnd()
X_AXIS = X_AXIS - 0.030
Z_AXIS = Z_AXIS - 0.030
glutSwapBuffers()
# Method2: Using glActiveTexture+glBindTexture+glTexCoord2f per face
def draw_method_2():
global X_AXIS, Y_AXIS, Z_AXIS
global DIRECTION
global id_textures
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glTranslatef(0.0, 0.0, -6.0)
glRotatef(X_AXIS, 1.0, 0.0, 0.0)
glRotatef(Y_AXIS, 0.0, 1.0, 0.0)
glRotatef(Z_AXIS, 0.0, 0.0, 1.0)
glActiveTexture(GL_TEXTURE0 + 0)
glBindTexture(GL_TEXTURE_2D, id_textures[0])
glBegin(GL_QUADS)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 1)
glBindTexture(GL_TEXTURE_2D, id_textures[1])
glBegin(GL_QUADS)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 2)
glBindTexture(GL_TEXTURE_2D, id_textures[2])
glBegin(GL_QUADS)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 3)
glBindTexture(GL_TEXTURE_2D, id_textures[3])
glBegin(GL_QUADS)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 4)
glBindTexture(GL_TEXTURE_2D, id_textures[4])
glBegin(GL_QUADS)
glTexCoord2f(1.0, 0.0)
glVertex3f(1.0, -1.0, -1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(1.0, 1.0, -1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(1.0, 1.0, 1.0)
glTexCoord2f(0.0, 0.0)
glVertex3f(1.0, -1.0, 1.0)
glEnd()
glActiveTexture(GL_TEXTURE0 + 5)
glBindTexture(GL_TEXTURE_2D, id_textures[5])
glBegin(GL_QUADS)
glTexCoord2f(0.0, 0.0)
glVertex3f(-1.0, -1.0, -1.0)
glTexCoord2f(1.0, 0.0)
glVertex3f(-1.0, -1.0, 1.0)
glTexCoord2f(1.0, 1.0)
glVertex3f(-1.0, 1.0, 1.0)
glTexCoord2f(0.0, 1.0)
glVertex3f(-1.0, 1.0, -1.0)
glEnd()
X_AXIS = X_AXIS - 0.030
Z_AXIS = Z_AXIS - 0.030
glutSwapBuffers()
def load_textures(use_active_texture):
global id_textures
id_textures.append(load_texture(use_active_texture, "tex00.jpg", 0))
id_textures.append(load_texture(use_active_texture, "tex01.jpg", 1))
id_textures.append(load_texture(use_active_texture, "tex02.jpg", 2))
id_textures.append(load_texture(use_active_texture, "tex03.jpg", 3))
id_textures.append(load_texture(use_active_texture, "tex04.jpg", 4))
id_textures.append(load_texture(use_active_texture, "tex05.jpg", 5))
def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
glutInitWindowSize(640, 480)
glutInitWindowPosition(200, 200)
glutCreateWindow(b'OpenGL Python Textured Cube')
init_gl(640, 480)
current_method = 2
draw_methods = {
0: {"f": draw_method_0, "use_active_texture": False},
1: {"f": draw_method_1, "use_active_texture": True},
2: {"f": draw_method_2, "use_active_texture": True}
}
draw = draw_methods[current_method]["f"]
load_textures(draw_methods[current_method]["use_active_texture"])
glutDisplayFunc(draw)
glutIdleFunc(draw)
glutKeyboardFunc(keyPressed)
glutMainLoop()
if __name__ == "__main__":
main()
如果我设置current_method=0
我将得到预期的输出,所有立方体面将使用不同的纹理(如预期):
如果我设置current_method=1
只有一个面将被正确地纹理化,这是一个错误的输出:
如果我设置current_method=2
所有面都将使用相同的纹理[0]进行纹理处理,这也是一个错误的输出:
我想了解为什么方法1和2的输出与方法0不同。我知道在使用着色器时正确地使用glActiveTexture会变得很简单,但我想了解在旧的固定管道上使用这些方法时出了什么问题。在
不,这不是一个错误的输出。这是完全正确的输出。您从未将固定函数管道状态设置为执行任何多文本处理(请参阅@Dietrich Epp的答案以获取详细信息)。渲染管道配置为:
GL_DECAL
模式)将结果混合在一起因此,很明显,从绑定到纹理单位>0的纹理中,您永远看不到任何内容。你看到了什么?在
当
current_method==0
时,您看到了您所期望的。在如果
current_method==1
,你会看到从第一个纹理中提取的一个样本,它一直绑定在0单元上。由于没有为单位0设置任何tex坐标,GL将只重复最近设置的值,即第一个面最后一个顶点的值(0,1)
。当然,这将用于新面的所有顶点,因此插值将产生一个恒定值,从而产生恒定的纹理采样结果,从而产生恒定的颜色。在现在使用
current_method=2
仍然有所有面在纹理0处绑定的第一个纹理。但是,由于现在再次为纹理单元0提供了正确的逐顶点texcoords,因此采样实际上会再次对不同区域的纹理进行采样,因此您将获得该纹理到基本体的合理映射。在我认为这里的核心问题是对多文本处理的误解。在
多重纹理同时将多个纹理应用于相同的基元。你想将不同的纹理,一次一个纹理,应用于不同的基本体。从这一点上应该可以清楚地看到,多纹理并不能满足您的需要,所以使用它是没有意义的。在
多织物的工作原理
在多重纹理处理中,多个纹理单元使用混合混合函数组合它们的结果。在
每个阶段的混合函数由}。这就是当年光照贴图与纹理的结合方式:一个纹理具有漫反射纹理,而一个纹理具有光照贴图纹理。在
glTexEnv
设置,可以是GL_MODULATE
,GL_DECAL
,或{同样,这与您想要达到的效果完全不同,所以多纹理在您的应用程序中没有意义。在
glActiveTexture的工作原理
glActiveTexture
不会更改绘制到屏幕上的纹理单元。默认情况下,只有纹理单位0将绘制到屏幕上。在glActiveTexture
只允许您将纹理绑定到其他纹理单元。但是,由于没有使用纹理单元1,因此将哪个纹理绑定到单元1或坐标是什么都无关紧要。所以您应该始终使用glActiveTexture(GL_TEXTURE0)
,因为您总是希望更改纹理单位#0。在解决方案
所以,你有不使用多重文本处理的工作代码。太好了!你完了。你不会因为使用更多的OpenGL功能而得到额外的积分。在
或者,如果使用2D数组纹理,可以在一次绘图调用中绘制整个立方体。只需将现有纹理加载为二维阵列纹理中的平面,并使用三维纹理坐标而不是二维纹理坐标。同样,不需要多纹理。在
相关问题 更多 >
编程相关推荐