Java glvertexattributepointer不';似乎不起作用,但没有错误

Java glvertexattributepointer不';似乎不起作用,但没有错误,java,opengl,glsl,shader,lwjgl,Java,Opengl,Glsl,Shader,Lwjgl,我一直在使用LWJGL 3和LearnOpenGL.com上的教程来创建游戏引擎。但是,在学习了本教程之后,我发现glVertexAttribPointer的使用不起作用。它在上传顶点位置和索引时起作用,但当我尝试上传颜色和纹理坐标时,什么都没有发生,我只得到一个白色框。我已附上渲染引擎、主类和着色器的源代码: 公共类网格{ 公共浮点数; 公共花色; 公开发行股票; 公共综合指数; 公共网格(float[]顶点、float[]颜色、float[]纹理词、int[]索引){ 这个。顶点=顶点; 这

我一直在使用LWJGL 3和LearnOpenGL.com上的教程来创建游戏引擎。但是,在学习了本教程之后,我发现
glVertexAttribPointer
的使用不起作用。它在上传顶点位置和索引时起作用,但当我尝试上传颜色和纹理坐标时,什么都没有发生,我只得到一个白色框。我已附上渲染引擎、主类和着色器的源代码:

公共类网格{
公共浮点数;
公共花色;
公开发行股票;
公共综合指数;
公共网格(float[]顶点、float[]颜色、float[]纹理词、int[]索引){
这个。顶点=顶点;
这个。颜色=颜色;
this.textureCoords=textureCoords;
该指数=指数;
}
}
公共类高级渲染器{
国际维也纳国际机场组织;
私家车;
私人国际电子银行;
私有网格;
私有着色器程序程序;
公共void Init(网格){
this.mesh=网格;
程序=新的着色器程序();
vao=GL30.GLGEnVertexArray();
vbo=GL20.glGenBuffers();
ebo=GL20.glGenBuffers();
}
公共空白渲染(颜色clearColor){
//清屏
GL11.glClearColor(clearColor.getRed(),clearColor.getGreen(),clearColor.getBlue(),clearColor.getAlpha());
GL11.glClear(GL11.GL_颜色_缓冲_位| GL11.GL_深度_缓冲_位);
//绑定vao
GL30.glBindVertexArray(vao);
//绑定缓冲区
GL20.glBindBuffer(GL20.GL_数组_BUFFER,vbo);
GL20.glBufferData(GL20.GL_数组_缓冲区、mesh.vertices、GL20.GL_静态_绘图);
GL20.glBindBuffer(GL20.GL_元素_数组_缓冲区,ebo);
GL20.glBufferData(GL20.GL\u元素\u数组\u缓冲区、mesh.index、GL20.GL\u静态\u绘图);
//启用顶点属性指针
GL20.glvertexattributepointer(0,3,GL11.GL_FLOAT,false,0,0);
GL20.GlenableVertexAttributeArray(0);
//处理纹理
Texture-Texture=Utils.LoadTexture(“resources//textures//test.png”);
//制服
//使用程序
program.UseProgram();
//画形状
GL20.glActiveTexture(GL20.GL_TEXTURE0);
GL20.glBindTexture(GL20.GL_TEXTURE_2D,TEXTURE.getId());
GL30.glBindVertexArray(vao);
GL20.GLD元素(GL20.GLU三角形,6,GL20.GLU无符号整数,0);
}
}
公共类着色器程序{
公共int程序id;
公共int vertexShaderID;
公共int fragmentShaderID;
公共着色器程序(){
programID=GL20.glCreateProgram();
试一试{
CompileVertexShader(Utils.LoadResource(“resources/shaders/default/defaultShader.vs”);
CompileFragmentShader(Utils.LoadResource(“resources/shaders/default/defaultShader.fs”);
GL20.glAttachShader(programmaid,vertexShaderID);
GL20.glAttachShader(programmaid,fragmentShaderID);
if(GL20.glGetShaderi(vertexShaderID,GL20.GL\u编译\u状态)==0){
Logger.LogErrorClose(“编译顶点着色器代码时出错:”+GL20.glGetShaderInfoLog(vertexShaderID,1024));
}
if(GL20.glGetShaderi(fragmentShaderID,GL20.GL\u编译\u状态)==0){
Logger.LogErrorClose(“编译片段着色器代码时出错:”+GL20.glGetShaderInfoLog(fragmentShaderID,1024));
}
GL20.glLinkProgram(programID);
}捕获(例外e){
e、 printStackTrace();
}
}
公共计划{
GL20.glUseProgram(programmaid);
GL20.glDeleteShader(vertexShaderID);
GL20.glDeleteShader(fragmentShaderID);
}
公共void编译器EvertexShader(字符串着色器代码){
vertexShaderID=GL20.glCreateShader(GL20.GL\u VERTEX\u着色器);
GL20.glShaderSource(vertexShaderID、shaderCode);
GL20.glCompileShader(vertexShaderID);
}
public void CompileFragmentShader(字符串着色器代码){
fragmentShaderID=GL20.glCreateShader(GL20.GL\u FRAGMENT\u着色器);
GL20.glShaderSource(fragmentShaderID,shaderCode);
GL20.glCompileShader(fragmentShaderID);
}
}
公共阶级结构{
私有int-id;
公共纹理(int-id){
this.id=id;
}
公共int getId(){
返回id;
}
}
公共级食物灯{
公共静态void main(字符串[]args){
LogMessage(“在LWJGL版本上运行:+Version.getVersion());
窗口w=新窗口();
长窗=w.CreateWindow(640360,“食物大战”);
MasterRenderer=新的MasterRenderer();
浮点[]顶点={
0.5f,0.5f,0f,
0.5f,-0.5f,0f,
-0.5f,-0.5f,0f,
-0.5f,0.5f,0f
};
浮动[]颜色={
1f、0f、0f、,
0f,1f,0f,
0f,0f,1f,
一楼、一楼、零楼
};
float[]纹理词={
一楼,一楼,
1楼,0楼,
0f,0f,
0f,1f
};
int[]索引={
0, 1, 3,
1, 2, 3
};
网格m=新网格(顶点、颜色、纹理词、索引);
Init(m);
而(!w.应关闭(窗口)){
ProcessInput(窗口);
renderer.Render(Color.black);
w、 扶手窗(窗户);
}
w、 破坏窗口(窗口);
}
}
片段:

#版本330核心
vec3颜色;
在vec2-texCoords中;
out vec4 fragColor;
均匀取样器;
void main(){
fragColor=纹理(输入纹理,纹理坐标)*vec4(颜色,1.0);
}
顶点:

#版本330核心
vec3载脂蛋白;
在vec3 aColor中;
在vec2 aTexCoord中;
输出vec3颜色;
out vec2 texCoord;
void main(){
gl_位置=vec4(aPos,1.0);
颜色=颜色;
texCoord=aTexCoord;
}
<