- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的着色器工作正常,我可以使用 glDrawArrays 进行绘制,但我很难让 glDrawElements 工作。我在 lwjgl 函数调用与标准 openGL 不同的地方添加了注释。代码:
import org.lwjgl.Sys
import org.lwjgl.glfw._
import org.lwjgl.opengl._
import java.nio.ByteBuffer
import java.nio.FloatBuffer
import org.lwjgl.glfw.Callbacks._
import org.lwjgl.glfw.GLFW._
import org.lwjgl.opengl.GL11._
import org.lwjgl.opengl.GL15._
import org.lwjgl.opengl.GL20._
import org.lwjgl.opengl.GL30._
import org.lwjgl.system.MemoryUtil._
import org.lwjgl.BufferUtils._
import hands._
import javafx.scene.shape.CullFace
class Test {
val vertex_positions: Array[Float] = Array(
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f
)
val vertex_indices: Array[Int] = Array(
0, 1, 2
)
// We need to strongly reference callback instances.
val errorCallback: GLFWErrorCallback = Callbacks.errorCallbackPrint();
val keyCallback: GLFWKeyCallback = new GLFWKeyCallback() {
@Override
def invoke(window: Long , key: Int, scancode: Int , action: Int , mods: Int) {
if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
glfwSetWindowShouldClose(window, GL_TRUE) // We will detect this in our rendering loop
}
}
val WIDTH = 800
val HEIGHT = 600
def run(): Unit = {
System.out.println("Hello LWJGL " + Sys.getVersion() + "!")
try {
val vertBuffer = hands.createFlippedBuffer(vertex_positions)
val indexBuffer = hands.createFlippedBuffer(vertex_indices)
// Setup an error callback. The default implementation
// will print the error message in System.err.
glfwSetErrorCallback(errorCallback)
// Initialize GLFW. Most GLFW functions will not work before doing this.
if ( glfwInit() != GL_TRUE )
throw new IllegalStateException("Unable to initialize GLFW")
// Configure our window
glfwDefaultWindowHints() // optional, the current window hints are already the default
glfwWindowHint(GLFW_VISIBLE, GL_FALSE) // the window will stay hidden after creation
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE) // the window will be resizable
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3)
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
// Create the window
val window = glfwCreateWindow(WIDTH, HEIGHT, "Hello World!", NULL, NULL)
if ( window == NULL )
throw new RuntimeException("Failed to create the GLFW window")
// Setup a key callback. It will be called every time a key is pressed, repeated or released.
glfwSetKeyCallback(window, keyCallback)
// Get the resolution of the primary monitor
val vidmode: ByteBuffer = glfwGetVideoMode(glfwGetPrimaryMonitor())
// Center our window
glfwSetWindowPos(
window,
(GLFWvidmode.width(vidmode) - WIDTH) / 2,
(GLFWvidmode.height(vidmode) - HEIGHT) / 2)
// Make the OpenGL context current
glfwMakeContextCurrent(window)
// Enable v-sync
glfwSwapInterval(1)
// Make the window visible
glfwShowWindow(window)
// This line is critical for LWJGL's interoperation with GLFW's
// OpenGL context, or any context that is managed externally.
// LWJGL detects the context that is current in the current thread,
// creates the ContextCapabilities instance and makes the OpenGL
// bindings available for use.
GLContext.createFromCurrent()
//create shader, and use it as program
val shader = new Shader()
glUseProgram(shader.program)
val vao = glGenVertexArrays()
glBindVertexArray(vao)
val vbo = glGenBuffers()
glBindBuffer(GL_ARRAY_BUFFER, vbo)
//http://javadoc.lwjgl.org/org/lwjgl/opengl/GL15.html#glBufferData%28int,%20java.nio.FloatBuffer,%20int%29
glBufferData(GL_ARRAY_BUFFER, vertBuffer, GL_STATIC_DRAW)
//this function accepts false instead of GL_FALSE
glVertexAttribPointer(0, 3, GL_FLOAT, false , 0, 0)
glEnableVertexAttribArray(0)
val ebo = glGenBuffers()
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
//http://javadoc.lwjgl.org/org/lwjgl/opengl/GL15.html#glBufferData%28int,%20java.nio.ShortBuffer,%20int%29
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL_STATIC_DRAW)
// Set the clear color
glClearColor(0, 0, 0.4f, 1)
// Run the rendering loop until the user has attempted to close
// the window or has pressed the ESCAPE key.
//glfwWindowShouldClose produces a GL_FALSE, instead of a boolean value
while ( glfwWindowShouldClose(window) == GL_FALSE ) {
glClear(GL_COLOR_BUFFER_BIT) // clear the framebuffer
glBindVertexArray(vao)
glEnableVertexAttribArray(0)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
//http://javadoc.lwjgl.org/org/lwjgl/opengl/GL11.html#glDrawElements%28int,%20java.nio.ShortBuffer%29
glDrawElements(GL_TRIANGLES, indexBuffer)
//glDrawArrays(GL_TRIANGLES, 0, 9)
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
}
// Release window and window callbacks
glfwDestroyWindow(window)
keyCallback.release()
} finally {
// Terminate GLFW and release the GLFWerrorfun
glfwTerminate()
errorCallback.release()
}
}
}
object main{
def main( args: Array[String] ) = {
new Test().run();
}
}
最佳答案
glDrawElements()
有两种变体最后一个参数的定义和使用方式有很大不同:
以“数据”作为参数。参数的确切类型取决于语言绑定(bind),但它通常类似于 C/C++ 中的指针、Java 中的缓冲区等。
一个接受整数偏移量作为参数。
如果缓冲区当前绑定(bind)到 GL_ELEMENT_ARRAY_BUFFER
,则使用选项 2 。作为最后一个参数给出的整数是相对于绑定(bind)缓冲区开头的偏移量(以字节为单位)。
如果没有缓冲区绑定(bind)到 GL_ELEMENT_ARRAY_BUFFER
,则使用选项 1 。在本例中,最后一个参数直接指定索引数据。
您的代码中的问题是您将两者混合在一起。您有缓冲区限制,因此需要使用选项 2。但是您正在使用选项 1。在您的情况下,正确的调用是:
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0)
请注意,计数(第二个参数)以顶点为单位给出,而偏移(最后一个参数)以字节为单位给出。由于您使用的是整个缓冲区,并且偏移量为 0,因此这里没有什么区别。但这是常见的错误来源。
在 C/C++ 等弱类型语言中,实际上只有一个 glDrawElements()
调用,选项 2 的偏移量被转换为指针。这也是如果您错误地使用选项 1 的调用(而不是 OpenGL 错误)会导致崩溃的原因。根据记录 C/C++ 绑定(bind)的规范,只有一次调用,因此在这种情况下不存在调用“错误”入口点的情况。它们只是更强类型语言中的不同入口点。
关于java - 使用 glDrawArrays 绘图工作正常,但使用 glDrawElements 则失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30756964/
我在使用以下代码时遇到问题: function http_file_exists($url){ $f=fopen($url,"r"); if($f){ fclose($f); retu
我已经通过 Git 部署到 Azure 几个月了,没有出现重大问题,但现在我似乎遇到了一个无法克服的错误。 我创建了一个新的 Azure 网站,为正在开发的项目创建单独的预览链接。我在新站点上设置了
我已经通过flutter创建了一个App并完成了它,我想在flutter文档中阅读时进行部署。 我收到此错误: FAILURE: Build failed with an exception. * W
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
我正在尝试使用 RapidJSON 解析从服务器接收到的数据。以下是收到的确切字符串: [ { "Node": "9478149a08f9", "Address": "172.17
我尝试为 ios 编译 OpenCV。我总是收到这些错误。我用不同版本的opencv试了一下,结果都是一样的。 我运行这个:python 平台/ios/build_framework.py ios_o
我在一台机器上做基本的发布/订阅,我的客户端是 StackExchange-Redis 的 C# 客户端,我在同一台机器上运行基于 Windows 的 Redis 服务器(服务器版本 2.8.4) 当
我有这段代码,但无法执行,请帮我解决这个问题 连接 connect_error) { die ("connection failed: " . $terhubung->connect_erro
我在 tomcat 上运行并由 maven 编译的 Web 应用程序给出了以下警告和错误。我可以在本地存储库中看到所有 JAR,但有人可以帮忙吗。 WARNING: Failed to scan JA
我正在 Windows 8 上使用 Android Studio 开发一个 android 应用程序,我正在使用一些 native 代码。突然间我无法编译我的 C 文件。当我运行 ndk-build
下面的代码对类和结构的成员进行序列化和反序列化。序列化工作正常,但我在尝试使用 oarch >> BOOST_SERIALIZATION_NVP(outObj); 反序列化时遇到了以下错误; 代码中是
如果我运行此命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,此文件中的所有测试都会通过。 但是,当我运行“rspec”时
我在尝试执行测试以使用 Protractor 上传文件时出错,我的代码是这个 it('it should be possible to upload a file', function() {
System.loadLibrary("nativefaceswap"); 当我运行我的应用程序时,我在 Android Studio 中发现了此类错误。在logcat中显示: java.lang.U
我希望有人能帮助我!使用任何方法或命令行的任何 SSL/HTTPS 调用均无效。 我在 Windows 10 中使用 Ubuntu Server 18.04 作为子系统。我的问题是昨天才开始出现的,因
通过删除这两个值将日期字段从 null=True 和 Blank=True 更改为 required 时,使用 db.alter 命令时遇到问题。 当以下行被注释掉时,迁移运行不会出现问题。
我第一次使用 Heroku 尝试创建应用程序(使用 SendGrid 的 Inbound Parse Webhook"和 Twilio SMS 通过电子邮件发送和接收 SMS 消息)。通过 Virtu
我正在将我的 swift 项目更新到 Xcode 7 上的 Swift 2.0。xcode 在构建项目时报告了以下错误: 命令/Applications/Xcode.app/Contents/Deve
在我的代码中,SSL 库函数 SSL_library_init() 没有按预期返回 1。我如何才能看到它返回了什么错误? 我在 SSL_library_init() 之后调用了 SSL_load_er
我正在尝试运行在以下链接中找到的答案: Asynchronously Load the Contents of a Div 但是当我这样做时,我会遇到我不太理解的错误。 我的代码: $(documen
我是一名优秀的程序员,十分优秀!