问题描述
我想使用wood.jpg作为OpenGL程序的背景。我希望该程序还显示模型basketball.obj,如图所示:
我已经阅读了几本教程(Youtube频道senddex,atibyte,The Cherno)。我还尝试了网站learningopengl.com,opengl-tutorial.org和codeloop.com。我也用过Udemy。这些都没有具体显示如何将.jpg用作.obj模型的背景。
我可以为已经在主代码中定义的多个模型运行代码。我还可以为多个.obj文件运行代码。但是我无法同时运行两个运行代码。
有人可以帮助我吗?我可以在OpenGL C ++和pyOpenGL for Python中进行编码。
到目前为止,我唯一成功的显示图像为wood.jpg作为背景:
#Code modified from https://codeloop.org/python-modern-opengl-texturing-rectangle/
import glfw
from OpenGL.GL import *
import OpenGL.GL.shaders
import numpy as np
from PIL import Image
def main():
if not glfw.init():
return
window = glfw.create_window(720,600,"Pyopengl Texturing Rectangle",None,None)
if not window:
glfw.terminate()
return
glfw.make_context_current(window)
# positions colors texture coords
rectangle = [-1.0,-1.0,0.0,1.0,1.0]
# convert to 32bit float
rectangle = np.array(rectangle,dtype=np.float32)
indicesRectange = [0,1,2,3,0]
indicesRectange = np.array(indicesRectange,dtype=np.uint32)
VERTEX_SHADER = """
#version 330
in vec3 position;
in vec3 color;
in vec2 InTexCoords;
out vec3 newColor;
out vec2 OutTexCoords;
void main() {
gl_Position = vec4(position,1.0);
newColor = color;
OutTexCoords = InTexCoords;
}
"""
FRAGMENT_SHADER = """
#version 330
in vec3 newColor;
in vec2 OutTexCoords;
out vec4 outColor;
uniform sampler2D samplerTex;
void main() {
outColor = texture(samplerTex,OutTexCoords);
}
"""
# Compile The Program and shaders
shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(VERTEX_SHADER,GL_VERTEX_SHADER),OpenGL.GL.shaders.compileShader(FRAGMENT_SHADER,GL_FRAGMENT_SHADER))
# Create Buffer object in gpu
VBO = glGenBuffers(1)
# Bind the buffer
glBindBuffer(GL_ARRAY_BUFFER,VBO)
glBufferData(GL_ARRAY_BUFFER,128,rectangle,GL_STATIC_DRAW)
# Create EBO
EBO = glGenBuffers(1)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO)
glBufferData(GL_ELEMENT_ARRAY_BUFFER,indicesRectange,GL_STATIC_DRAW)
# get the position from shader
#position = glGetAttribLocation(shader,'position')
position = 0
glVertexAttribPointer(position,GL_FLOAT,GL_FALSE,32,ctypes.c_void_p(0))
glEnableVertexAttribArray(position)
# get the color from shader
#color = glGetAttribLocation(shader,'color')
color = 1
glVertexAttribPointer(color,ctypes.c_void_p(12))
glEnableVertexAttribArray(color)
#texCoords = glGetAttribLocation(shader,"InTexCoords")
texCoords = 2
glVertexAttribPointer(texCoords,ctypes.c_void_p(24))
glEnableVertexAttribArray(texCoords)
glBindAttribLocation(shader,position,'position' )
glBindAttribLocation(shader,color,'color' )
glBindAttribLocation(shader,texCoords,'InTexCoords' )
# Creating Texture
texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D,texture)
# texture wrapping params
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT)
# texture filtering params
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
image = Image.open("wood.jpg")
img_data = np.array(list(image.getdata()),np.uint8)
glTexImage2D(GL_TEXTURE_2D,GL_RGB,512,GL_UNSIGNED_BYTE,img_data)
glUseProgram(shader)
glClearColor(1.0,1.0)
while not glfw.window_should_close(window):
glfw.poll_events()
glClear(GL_COLOR_BUFFER_BIT)
# Draw Rectangle
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,None)
glfw.swap_buffers(window)
glfw.terminate()
if __name__ == "__main__":
main()
[UPDATE]这是我尝试的最后一个代码。它结合了纹理教程中的代码和对象加载器教程中的代码:
# Object loading code by AtiBYte - OpenGL in python e15 - loading 3D .obj files. Youtube
# Background Texture loading code modified from CodeLoop.org https://codeloop.org/python-modern-opengl-texturing-rectangle/
import glfw
from OpenGL.GL import *
from OpenGL.GL.shaders import compileProgram,compileShader
import pyrr
from TextureLoader import load_texture
from ObjLoader import ObjLoader
# imports for background texture
import numpy as np
from PIL import Image
############## Background Texture ######################
# positions colors texture coords
rectangle = [-1.0,1.0]
# convert to 32bit float
rectangle = np.array(rectangle,dtype=np.float32)
indicesBackground = [0,0]
indicesBackground = np.array(indicesBackground,dtype=np.uint32)
VERTEX_SHADER = """
#version 330
in vec3 position;
in vec3 color;
in vec2 InTexCoords;
out vec3 newColor;
out vec2 OutTexCoords;
void main() {
gl_Position = vec4(position,1.0);
newColor = color;
OutTexCoords = InTexCoords;
}
"""
FRAGMENT_SHADER = """
#version 330
in vec3 newColor;
in vec2 OutTexCoords;
out vec4 outColor;
uniform sampler2D samplerTex;
void main() {
outColor = texture(samplerTex,OutTexCoords);
}
"""
########################################################
vertex_src = """
# version 330
layout(location = 0) in vec3 a_position;
layout(location = 1) in vec2 a_texture;
layout(location = 2) in vec3 a_normal;
uniform mat4 model;
uniform mat4 projection;
uniform mat4 view;
out vec2 v_texture;
void main()
{
gl_Position = projection * view * model * vec4(a_position,1.0);
v_texture = a_texture;
}
"""
fragment_src = """
# version 330
in vec2 v_texture;
out vec4 out_color;
uniform sampler2D s_texture;
void main()
{
out_color = texture(s_texture,v_texture);
}
"""
# glfw callback functions
def window_resize(window,width,height):
glViewport(0,height)
projection = pyrr.matrix44.create_perspective_projection_matrix(45,width / height,0.1,100)
glUniformMatrix4fv(proj_loc,projection)
# initializing glfw library
if not glfw.init():
raise Exception("glfw can not be initialized!")
# creating the window
window = glfw.create_window(1280,720,"My OpenGL window",None)
# check if window was created
if not window:
glfw.terminate()
raise Exception("glfw window can not be created!")
# set window's position
glfw.set_window_pos(window,400,200)
# set the callback function for window resize
glfw.set_window_size_callback(window,window_resize)
# make the context current
glfw.make_context_current(window)
# load here the 3d meshes
chibi_indices,chibi_buffer = ObjLoader.load_model("meshes/chibi.obj")
monkey_indices,monkey_buffer = ObjLoader.load_model("meshes/monkey.obj")
shaderObj = compileProgram(compileShader(vertex_src,compileShader(fragment_src,GL_FRAGMENT_SHADER))
# VAO and VBO
VAO = glGenVertexArrays(2)
VBO = glGenBuffers(3) #edited from 2 to 3 for background texture
# EBO = glGenBuffers(1)
# Chibi VAO
glBindVertexArray(VAO[0])
# Chibi Vertex Buffer Object
glBindBuffer(GL_ARRAY_BUFFER,VBO[0])
glBufferData(GL_ARRAY_BUFFER,chibi_buffer.nbytes,chibi_buffer,GL_STATIC_DRAW)
# glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO)
# glBufferData(GL_ELEMENT_ARRAY_BUFFER,chibi_indices.nbytes,chibi_indices,GL_STATIC_DRAW)
# chibi vertices
glEnableVertexAttribArray(0)
glVertexAttribPointer(0,chibi_buffer.itemsize * 8,ctypes.c_void_p(0))
# chibi textures
glEnableVertexAttribArray(1)
glVertexAttribPointer(1,ctypes.c_void_p(12))
# chibi normals
glVertexAttribPointer(2,ctypes.c_void_p(20))
glEnableVertexAttribArray(2)
# Monkey VAO
glBindVertexArray(VAO[1])
# Monkey Vertex Buffer Object
glBindBuffer(GL_ARRAY_BUFFER,VBO[1])
glBufferData(GL_ARRAY_BUFFER,monkey_buffer.nbytes,monkey_buffer,GL_STATIC_DRAW)
# monkey vertices
glEnableVertexAttribArray(0)
glVertexAttribPointer(0,monkey_buffer.itemsize * 8,ctypes.c_void_p(0))
# monkey textures
glEnableVertexAttribArray(1)
glVertexAttribPointer(1,ctypes.c_void_p(12))
# monkey normals
glVertexAttribPointer(2,ctypes.c_void_p(20))
glEnableVertexAttribArray(2)
############### Background Texture #################################
# Bind the buffer
glBindBuffer(GL_ARRAY_BUFFER,VBO[2])
glBufferData(GL_ARRAY_BUFFER,GL_STATIC_DRAW)
# Create EBO
EBO = glGenBuffers(1)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO)
glBufferData(GL_ELEMENT_ARRAY_BUFFER,indicesBackground,GL_STATIC_DRAW)
# get the position from shader
position = glGetAttribLocation(shaderObj,'position')
glVertexAttribPointer(position,ctypes.c_void_p(0))
glEnableVertexAttribArray(position)
# get the color from shader
# color = glGetAttribLocation(shader,'color')
color = 1
glVertexAttribPointer(color,ctypes.c_void_p(12))
glEnableVertexAttribArray(color)
# texCoords = glGetAttribLocation(shader,"InTexCoords")
texCoords = 2
glVertexAttribPointer(texCoords,ctypes.c_void_p(24))
glEnableVertexAttribArray(texCoords)
glBindAttribLocation(shaderObj,'position')
glBindAttribLocation(shaderObj,'color')
glBindAttribLocation(shaderObj,'InTexCoords')
# Creating Texture
texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D,texture)
# texture wrapping params
glTexParameteri(GL_TEXTURE_2D,GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D,GL_REPEAT)
# texture filtering params
glTexParameteri(GL_TEXTURE_2D,GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D,GL_LINEAR)
image = Image.open("wood.jpg")
img_data = np.array(list(image.getdata()),np.uint8)
glTexImage2D(GL_TEXTURE_2D,img_data)
#####################################################################
textures = glGenTextures(2)
load_texture("meshes/chibi.png",textures[0])
load_texture("meshes/monkey.jpg",textures[1])
glUseProgram(shaderObj)
glClearColor(0,1)
glEnable(GL_DEPTH_TEST)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
projection = pyrr.matrix44.create_perspective_projection_matrix(45,1280 / 720,100)
chibi_pos = pyrr.matrix44.create_from_translation(pyrr.Vector3([0,-5,-10]))
monkey_pos = pyrr.matrix44.create_from_translation(pyrr.Vector3([-4,0]))
# eye,target,up
view = pyrr.matrix44.create_look_at(pyrr.Vector3([0,8]),pyrr.Vector3([0,0]),0]))
model_loc = glGetUniformLocation(shaderObj,"model")
proj_loc = glGetUniformLocation(shaderObj,"projection")
view_loc = glGetUniformLocation(shaderObj,"view")
glUniformMatrix4fv(proj_loc,projection)
glUniformMatrix4fv(view_loc,view)
# the main application loop
while not glfw.window_should_close(window):
glfw.poll_events()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
rot_y = pyrr.Matrix44.from_y_rotation(0.8 * glfw.get_time())
model = pyrr.matrix44.multiply(rot_y,chibi_pos)
# draw the chibi character
glBindVertexArray(VAO[0])
glBindTexture(GL_TEXTURE_2D,textures[0])
glUniformMatrix4fv(model_loc,model)
glDrawArrays(GL_TRIANGLES,len(chibi_indices))
rot_y = pyrr.Matrix44.from_y_rotation(-0.8 * glfw.get_time())
model = pyrr.matrix44.multiply(rot_y,monkey_pos)
# draw the monkey head
glBindVertexArray(VAO[1])
glBindTexture(GL_TEXTURE_2D,textures[1])
glUniformMatrix4fv(model_loc,len(monkey_indices))
# Draw Background Texture
glDrawElements(GL_TRIANGLES,len(chibi_indices),None)
glfw.swap_buffers(window)
# terminate glfw,free up allocated resources
glfw.terminate()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)