gpt4 book ai didi

java - 奇怪的 glVertexAttrib 行为?

转载 作者:行者123 更新时间:2023-12-01 04:33:38 26 4
gpt4 key购买 nike

我目前正在将着色器系统添加到我的项目中,但遇到了一些障碍,我希望有人能够解决。我的项目是用 Java 编写的,使用 LWJGL 库,并以 OpenGL 2.1 为目标。

根据我的理解,使用glVertexAttrib函数设置一个属性,该属性在传递新值之前保持不变。例如,以下调用应使所有几何图形变为白色,直到我更改它为止:

glVertexAttrib3f(shader.getAttributeLocation("in_Color"), 1.0f, 1.0f, 1.0f);

但是,如果 in_Color绑定(bind)到索引 0(使用 glGetAttribLocation 时就是这种情况),每次调用 glVertexAttrib3f 仅影响一个顶点。例如,如果我将其放入我的初始化代码中:

int colorLocation = shader.getAttributeLocation("in_Color");
glVertexAttrib3f(colorLocation, 1.0f, 1.0f, 1.0f);
glVertexAttrib3f(colorLocation, 1.0f, 0.0f, 0.0f);
glVertexAttrib3f(colorLocation, 0.0f, 1.0f, 0.0f);
glVertexAttrib3f(colorLocation, 0.0f, 0.0f, 1.0f);

然后尝试使用以下方法渲染立方体:

for(int i = 0; i < 6; i++) {
glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4);
}

这是渲染的:/image/2Fn4U.jpg

但是,如果 in_Color绑定(bind)到任何其他属性索引,整个立方体是蓝色的,如预期:/image/Pmyw2.jpg

最佳答案

我也刚刚遇到这个错误。

使用我的英特尔高清显卡 3000(驱动程序版本 8.17.12.9632),glVertexAttrib*() 的工作方式就好像卡在 glBegin()/glEnd() 之间一样。每个调用大概都会将属性值附加到渲染时逐个顶点使用的内部数组,就像立即模式一样。该数组在刷新/交换后不会被清除,因此您无法重置这些值。它看起来确实只发生在属性索引(位置)0 上。

此行为与同一机器中的 Nvidia 卡的行为不匹配。您可以将 Intel 检测为 GL_VENDOR 并有选择地尝试我的解决方法。它似乎提醒驱动程序它没有使用立即模式调用,但只有在使用 glVertexAttrib*() 调用的每个帧中完成时它才有效。在每帧调用一次 glVertexAttrib*() 之前执行此操作:

if(apply_Intel_attrib_workaround && location == 0)
{
apply_Intel_attrib_workaround = 0;
glBegin(GL_TRIANGLES);
glEnd();
}

*apply_Intel_attrib_workaround* 必须在帧完成后设置为 1。

关于java - 奇怪的 glVertexAttrib 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17608643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com