OpenGL 驱动程序在 glTexture2D 上崩溃
OpenGL driver crash on glTexture2D
使用以下 Kotlin/JVM/LWJGL + java.nio.ByteBuffer + OpenGL 代码似乎我可以使我的某些驱动程序崩溃:
val texture = glGenTextures()
glBindTexture(GL_TEXTURE_2D, texture)
val w = 1026
val h = 1029
val byteBuffer = ByteBuffer
.allocateDirect(w*h)
.position(0)
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, byteBuffer)
在通常的 GLFW+OpenGL 初始化之后执行此操作,这会导致应用程序崩溃并显示以下消息:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff98593509c, pid=13572, tid=15424
#
# JRE version: OpenJDK Runtime Environment (12.0.1+12) (build 12.0.1+12)
# Java VM: OpenJDK 64-Bit Server VM (12.0.1+12, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C [atio6axx.dll+0x1bb509c]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Antonio\Documents\IdeaProjects\VideoStudio\hs_err_pid13572.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
有什么我可以做的,但要避免非 2 次幂纹理?
我测试了一些分辨率,只有宽度或高度 > 1024 的纹理才会崩溃。
在 1026 x 1029(以及更多,例如 1590 x 2244)的情况下,我在 100% 的情况下都会崩溃。
我正在使用 RX 580、R5 2600、Win 10,Radeon 驱动程序已更新为推荐,以防万一它会改变某些东西。
图像数据中行的默认对齐方式为 4 字节。除非你的纹理的宽度是 4 的倍数,否则你必须在每一行的末尾提供额外的字节来填充。
另一种选择是通过调用
将解包对齐更改为 1 字节
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
在调用 glTexImage2D
.
之前
使用以下 Kotlin/JVM/LWJGL + java.nio.ByteBuffer + OpenGL 代码似乎我可以使我的某些驱动程序崩溃:
val texture = glGenTextures()
glBindTexture(GL_TEXTURE_2D, texture)
val w = 1026
val h = 1029
val byteBuffer = ByteBuffer
.allocateDirect(w*h)
.position(0)
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, byteBuffer)
在通常的 GLFW+OpenGL 初始化之后执行此操作,这会导致应用程序崩溃并显示以下消息:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff98593509c, pid=13572, tid=15424
#
# JRE version: OpenJDK Runtime Environment (12.0.1+12) (build 12.0.1+12)
# Java VM: OpenJDK 64-Bit Server VM (12.0.1+12, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C [atio6axx.dll+0x1bb509c]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Antonio\Documents\IdeaProjects\VideoStudio\hs_err_pid13572.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
有什么我可以做的,但要避免非 2 次幂纹理?
我测试了一些分辨率,只有宽度或高度 > 1024 的纹理才会崩溃。 在 1026 x 1029(以及更多,例如 1590 x 2244)的情况下,我在 100% 的情况下都会崩溃。
我正在使用 RX 580、R5 2600、Win 10,Radeon 驱动程序已更新为推荐,以防万一它会改变某些东西。
图像数据中行的默认对齐方式为 4 字节。除非你的纹理的宽度是 4 的倍数,否则你必须在每一行的末尾提供额外的字节来填充。
另一种选择是通过调用
将解包对齐更改为 1 字节glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
在调用 glTexImage2D
.