Python (Py)SDL2:绘制纹理多边形

Python (Py)SDL2:绘制纹理多边形,python,textures,sdl-2,texture-mapping,pysdl2,Python,Textures,Sdl 2,Texture Mapping,Pysdl2,我正在尝试使用sdl_gfx在PySDL2中将此图像渲染为多边形上的纹理 但其显示完全失真,如SDL窗口右下角所示: 我在其中测试了我在中实现的所有sdlgfx绘图函数,这些函数负责绘图和渲染。它们都工作得很好,除了抗锯齿多边形(中间的绿色六边形,但这是下一次的另一个问题)和纹理多边形 为了提供更基本的脚本,我按照以下步骤绘制纹理多边形: PySDL2 version: 0.9.3 SDL2 version: 2.0.3 上述示例脚本仅输出: 我发现使用SDL2进行ctype转换和所有这

我正在尝试使用sdl_gfx在PySDL2中将此图像渲染为多边形上的纹理

但其显示完全失真,如SDL窗口右下角所示:

我在其中测试了我在中实现的所有sdlgfx绘图函数,这些函数负责绘图和渲染。它们都工作得很好,除了抗锯齿多边形(中间的绿色六边形,但这是下一次的另一个问题)和纹理多边形

为了提供更基本的脚本,我按照以下步骤绘制纹理多边形:

PySDL2 version: 0.9.3
SDL2 version: 2.0.3
上述示例脚本仅输出:

我发现使用SDL2进行ctype转换和所有这些都是非常令人畏惧的,我很高兴我走到了这一步,但我似乎无法独自解决这个问题。有人知道我在哪一步犯了错误,或者有人能给我指出正确的方向吗


作为旁注,我知道PySDL有渲染图像的工厂函数,这些函数工作得很好,但我真的希望多边形的纹理选项也能工作。

您的问题是缺少事件循环实现。
TestEventProcessor
不处理基于纹理的窗口更新,而是处理纯软件缓冲区。相反,你想要的是大致如下的东西:

# Initialize SDL2 and window
import sdl2
import sdl2.ext
import sdl2.sdlgfx
import ctypes
sdl2.ext.init()
window = sdl2.ext.Window(size=(800,600))
window.show()

# Create renderer and factories
renderer = sdl2.ext.Renderer(window)
renderer.clear(0)
renderer.present()
# Create sprite factory to create textures with later
texture_factory = sdl2.ext.SpriteFactory(renderer=renderer)
# Create sprite factory to create surfaces with later
surface_factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)

# Determine path to image to use as texture
RESOURCES = sdl2.ext.Resources(__file__, "LSD/resources")
image_path = RESOURCES.get_path("Memory.jpeg")

# set polygon coordinates
x = 100
row4 = 470
vx = [x, x+200, x+200, x]
vy = [row4-50, row4-50, row4+50, row4+50]

# Calculate the length of the vectors (which should be the same for x and y)
n = len(vx) 
# Make sure all coordinates are integers
vx = map(int,vx)
vy = map(int,vy)
# Cast the list to the appropriate ctypes vectors reabable by
# the sdlgfx polygon functions
vx = ctypes.cast((sdl2.Sint16*n)(*vx), ctypes.POINTER(sdl2.Sint16))
vy = ctypes.cast((sdl2.Sint16*n)(*vy), ctypes.POINTER(sdl2.Sint16))

# Load the image on an SoftwareSprite
# The underlying surface is available at SoftwareSprite.surface
texture = surface_factory.from_image(image_path)

## RENDER THE POLYGON WITH TEXTURE
sdl2.sdlgfx.texturedPolygon(renderer.renderer, vx, vy, n,\
texture.surface, 0, 0)

# Swap buffers
renderer.present()

# Handle window close events
processor = sdl2.ext.TestEventProcessor()
processor.run(window)

sdl2.ext.quit()

查看
gfxdrawing.py
示例,了解一个简单的实现。

我发现这只是底层sdl2\u gfx库中C/DLL级别的一个bug。sdl2_gfx的自制版本为1.0.0,而版本1.0.1(2014年6月15日)已经发布。我在Windows和Ubuntu上测试了它,我在Windows和Ubuntu上有sdl2_gfx 1.0.1可用,并且纹理多边形绘制正确(尽管偏移参数的使用对我来说仍然有点模糊)


底线:如果您想使用纹理多边形,请不要使用sdl2_gfx 1.0.0,因为它在那里不起作用。尝试使用v1.0.1。

谢谢您的回复!不幸的是,在实现了这个事件循环之后,我仍然得到了相同的纹理乱码显示。奇怪的是,图像等的显示确实起作用,因为我也认为这是作为引擎盖下的纹理渲染来完成的?
## RENDER THE POLYGON WITH TEXTURE
sdl2.sdlgfx.texturedPolygon(renderer.renderer, vx, vy, n,texture.surface, 0, 0)

running = True
while running:
    events = sdl2.ext.get_events()
    for event in events:
        if event.type == sdl2.SDL_QUIT:
            running = False
            break
    # Add some time step here
    renderer.present()

sdl2.ext.quit()