Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在渲染为黑色四边形的纹理_Java_Textures_Lwjgl_Opengl 3 - Fatal编程技术网

Java 正在渲染为黑色四边形的纹理

Java 正在渲染为黑色四边形的纹理,java,textures,lwjgl,opengl-3,Java,Textures,Lwjgl,Opengl 3,我一直在尝试按照中的指定进行操作,但结果是黑色而不是纹理 我使用的是将纹理使用的图像加载到直接ByteBuffer中,并且可以保证缓冲区中的RGB数据至少是不均匀的-所以它不可能是那样 我通常不喜欢转储代码,但在这一点上,我看不出还有什么可以做的。以下是我的java代码和着色器: GL是指向LWJGL31中所有GL功能的接口 ShaderProgram将所有特定于着色器的内容包装到一个漂亮的黑盒中,该黑盒在第一次调用use(GL)时从附加的着色器生成一个着色器程序,然后重用该程序。这对于渲染彩

我一直在尝试按照中的指定进行操作,但结果是黑色而不是纹理

我使用的是将纹理使用的图像加载到直接ByteBuffer中,并且可以保证缓冲区中的RGB数据至少是不均匀的-所以它不可能是那样

我通常不喜欢转储代码,但在这一点上,我看不出还有什么可以做的。以下是我的java代码和着色器:

GL
是指向LWJGL31中所有GL功能的接口

ShaderProgram
将所有特定于着色器的内容包装到一个漂亮的黑盒中,该黑盒在第一次调用
use(GL)
时从附加的着色器生成一个着色器程序,然后重用该程序。这对于渲染彩色三角形非常有效,所以我排除了其中的任何错误

Util.checkError(GL,布尔值)
会检查自上次执行以来累积的任何OpenGL错误,如果未设置布尔值,则会引发运行时异常(如果已设置,则会以静默方式写入日志)

渲染代码update(GL,long)每帧运行一次

顶点着色器

片段着色器



1我将LWJGL3的GL###静态类包装到一个接口和实现中,这样我就可以有一堆有状态的方法来做一些事情,比如识别要呈现的上下文,等等。我还尽了最大努力从界面中删除了非核心功能,因此我甚至不想使用不推荐的东西

仅看代码很难判断,但黑色四元表示片段着色器中的这一行:

frag_colour = texture(texture, texCoord) * vec4(color, 1.0);
计算结果为0。这意味着要么纹理未正确读取/绑定,要么纹理坐标已关闭,要么颜色为零向量。确保正确加载纹理图像(文件存在,具有宽度和高度等)并具有正确的格式。调试着色器时,我通常会将每个参数设置为颜色,以提示其值是否正确:

frag_colour = vec4(color, 1.0); //Makes sure the color is right

如果这还不能提供足够的信息,更详细的信息:

frag_colour = vec4(color.x, color.x, color.x, 1.0);


仅启用索引为0的“顶点”属性,但这会启用3次

调整您的代码,如下所示:

gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 0);
gl.glEnableVertexAttribArray(0);

gl.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 3 * Float.BYTES);
gl.glEnableVertexAttribArray(1); // <-------

gl.glVertexAttribPointer(2, 2, GL.GL_FLOAT, false, 8 * Float.BYTES, 6 * Float.BYTES);
gl.glEnableVertexAttribArray(2); // <------
gl.glvertexattributepointer(0,3,gl.gl_FLOAT,false,8*FLOAT.BYTES,0);
GlenableVertexAttributeArray(0);
gl.glvertexattributepointer(1,3,gl.gl_FLOAT,false,8*FLOAT.BYTES,3*FLOAT.BYTES);
GlenableVertexAttributeArray(1)//
frag_colour = vec4(color, 1.0); //Makes sure the color is right
frag_colour = texture(texture, texCoord); //Makes sure the texture is loaded and bound
frag_colour = vec4(color.x, color.x, color.x, 1.0);
frag_colour = vec4(texCoord.x, texCoord.x, texCoord.x, 1.0);
gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 0);
gl.glEnableVertexAttribArray(0);

gl.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 3 * Float.BYTES);
gl.glEnableVertexAttribArray(1); // <-------

gl.glVertexAttribPointer(2, 2, GL.GL_FLOAT, false, 8 * Float.BYTES, 6 * Float.BYTES);
gl.glEnableVertexAttribArray(2); // <------