2017-11-13 6 views
0

Nach Verwendung von glGetActiveUniform Abstürze sowohl mit nVidia und AMD GPUs mit LWJGL 3.1.3:LWJGL glGetActiveUniform und glGetActiveAttrib stürzt

val strLen = glGetProgrami(program, GL_ACTIVE_UNIFORM_MAX_LENGTH) 

val length = Array.ofDim[Int](1) 
val size = Array.ofDim[Int](1) 
val `type` = Array.ofDim[Int](1) 
val name = Array.ofDim[Byte](strLen) 
length(0) = 0 
size(0) = 0 
`type`(0) = 0 
name(0) = 0 
glGetActiveUniform(program, i, length, size, `type`, java.nio.ByteBuffer.wrap(name)) 

Etwas ausführlichere Version mit drei API-Aufrufe arbeitet gut zu mir:

val xName = glGetActiveUniformName(program, i) 
val xSize = glGetActiveUniformsi(program, i, GL_UNIFORM_SIZE) 
val xType = glGetActiveUniformsi(program, i, GL_UNIFORM_TYPE) 

Vor kurzem traf ich das gleiche Problem mit glGetActiveAttrib, für die ich keine Abhilfe API finden:

val strLen = glGetProgrami(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH) 

val length = Array.ofDim[Int](1) 
val size = Array.ofDim[Int](1) 
val `type` = Array.ofDim[Int](1) 
val name = Array.ofDim[Byte](64) 
glGetActiveAttrib(program, i, length, size, `type`, java.nio.ByteBuffer.wrap(name)) 

Ich habe keine Beispiele gefunden, wie diese API verwendet werden soll. Was mache ich falsch? Benötige ich vielleicht komplexere oder andere Puffermanipulationen? (Mein Quellcode ist Scala, ich hoffe, dass dies kein Problem für Java-Programmierer zu verstehen ist)

Antwort

0

Meine nio Verwendung war naiv, ohne echtes Verständnis geschrieben. Nach einem wenig lernen, vor allem aus Memory management in LWJGL 3 und prüft, wie glGetActiveUniformName implementiert, die der Code funktioniert gut ist:

import org.lwjgl.system._ 

val stackMem = MemoryStack.stackPush() 
try { 
    val strLen = glGetProgrami(program, GL_ACTIVE_UNIFORM_MAX_LENGTH) 
    val length = stackMem.mallocInt(1) 
    val size = stackMem.mallocInt(1) 
    val `type` = stackMem.mallocInt(1) 
    val name = stackMem.malloc(strLen) 

    glGetActiveUniform(program, i, length, size, `type`, name) 
    (size.get(0), `type`.get(0), MemoryUtil.memASCII(name, length.get(0))) 
} finally { 
    stackMem.close() 
} 

Der wichtigste Unterschied ist LWJGL direkten NIO-Puffer verwendet werden muss.