java – 我的ShaderProgram不起作用
发布时间:2020-12-15 02:08:46 所属栏目:Java 来源:网络整理
导读:我的主要语言是法语,我会努力做到最好. 我尝试了解着色器,但我无法找到为什么我的着色器不起作用.我使用VAO绘制2个VBO.一个用于顶点,另一个用于索引.我的对象渲染得很好,但我的着色器似乎没有任何效果. 我的svn项目日食; http://sourceforge.net/projects/ma
我的主要语言是法语,我会努力做到最好.
我尝试了解着色器,但我无法找到为什么我的着色器不起作用.我使用VAO绘制2个VBO.一个用于顶点,另一个用于索引.我的对象渲染得很好,但我的着色器似乎没有任何效果. 我的svn项目日食; http://sourceforge.net/projects/mad-game-engine 我的vao设置; 我的ShaderProgram; package fr.mad.engine.shader; import java.io.BufferedReader; import java.io.FileReader; import com.jogamp.opengl.GL; import com.jogamp.opengl.GL2; import com.jogamp.opengl.GL2ES2; import com.jogamp.opengl.GL4; import fr.mad.engine.LOG; public abstract class ShaderProgram { private int programID; private int vertexShaderID; private int fragmentShaerID; private LOG log; public ShaderProgram(String vertexFile,String fragmentFile,LOG log,GL2 gl) { this.log = new LOG(log,"shader"); vertexShaderID = loadShader(vertexFile,GL2ES2.GL_VERTEX_SHADER,gl.getGL2()); fragmentShaerID = loadShader(fragmentFile,GL2ES2.GL_FRAGMENT_SHADER,gl.getGL2()); programID = gl.glCreateProgram(); gl.glAttachShader(programID,vertexShaderID); gl.glAttachShader(programID,fragmentShaerID); bindAttributes(gl); gl.glLinkProgram(programID); gl.glValidateProgram(programID); checkProgram(gl,programID); } public void start(GL2 gl) { gl.glUseProgram(programID); } public void stop(GL2 gl) { gl.glUseProgram(0); } public void clenUp(GL2 gl) { stop(gl); gl.glDetachShader(programID,vertexShaderID); gl.glDetachShader(programID,fragmentShaerID); gl.glDeleteShader(vertexShaderID); gl.glDeleteShader(this.fragmentShaerID); gl.glDeleteProgram(programID); } protected abstract void bindAttributes(GL2 gl); protected void bindAttribute(GL2 gl,int i,String t) { gl.glBindAttribLocation(programID,i,t); } private int loadShader(String file,int type,GL2 gl) { log.log("Loading " + (GL2ES2.GL_VERTEX_SHADER == type ? "Vertex" : "Fragment") + " Shader"); StringBuilder shaderSource = new StringBuilder(); try { BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { shaderSource.append(line).append("n"); } } catch (Exception e) { e.printStackTrace(); } int shaderID = gl.glCreateShader(type); gl.glShaderSource(shaderID,1,new String[] { shaderSource.toString() },new int[] { shaderSource.toString().length() },0); gl.glCompileShader(shaderID); checkShader(gl,shaderID); log.log(""); return shaderID; } private void checkProgram(GL2 gl,int handle) { int[] buffer = new int[1]; gl.glGetObjectParameterivARB(handle,GL2.GL_OBJECT_LINK_STATUS_ARB,buffer,0); if (buffer[0] == GL.GL_FALSE) // 1 or 0 warning("error linking program "); gl.glValidateProgramARB(handle); gl.glGetObjectParameterivARB(handle,GL2.GL_OBJECT_VALIDATE_STATUS_ARB,0); if (buffer[0] == GL.GL_FALSE) warning("program not validate"); gl.glGetObjectParameterivARB(handle,GL2.GL_OBJECT_INFO_LOG_LENGTH_ARB,0); byte[] log = new byte[buffer[0]]; gl.glGetInfoLogARB(handle,buffer[0],log,0); if (log[0] != 0) warning("linker info log:n" + new String(log)); } private void checkShader(GL2 gl,int handle) { int[] buffer = new int[1]; gl.glGetObjectParameterivARB(handle,GL2.GL_OBJECT_COMPILE_STATUS_ARB,0); if (buffer[0] == GL.GL_FALSE) { warning("error compiling shader"); } gl.glGetObjectParameterivARB(handle,0); if (log[0] != 0) warning("compiler info log:n" + new String(log,log.length - 1)); } private void warning(String string) { log.log(string); } } 顶点着色器; #version 400 core in vec3 position; out vec3 colour; void main(void){ gl_Position = vec4(position.xyz,1.0); colour = sin(vec3(0,0)); } 碎片; #version 400 core in vec3 colour; out vec4 out_Color; void main(void){ out_Color = vec4(colour,1.0); gl_FragColor = vec4(colour,1.0); } 我的绘画方法; shader.start(gl); gl.glBindVertexArray(vaoid); gl.glBindBuffer(GL2.GL_ARRAY_BUFFER,vbovertid); gl.glEnableVertexAttribArray(0); gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER,vboindexid); gl.glEnableVertexAttribArray(1); gl.glColor3f(1f,0); gl.glDrawElements(GL.GL_TRIANGLES,this.indices.length,GL.GL_UNSIGNED_INT,0); gl.glEnableVertexAttribArray(1); gl.glEnableVertexAttribArray(0); gl.glBindBuffer(GL2.GL_ARRAY_BUFFER,0); gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER,0); gl.glBindVertexArray(0); shader.stop(gl); 在着色器程序中使用theses方法; private void checkProgram(GL2 gl,int handle) { int[] buffer = new int[1]; gl.glGetProgramiv(handle,GL2ES2.GL_LINK_STATUS,0); if (buffer[0] == GL.GL_FALSE) // 1 or 0 warning("error linking program "); gl.glValidateProgram(handle); gl.glGetProgramiv(handle,GL2.GL_VALIDATE_STATUS,0); if (buffer[0] == GL.GL_FALSE) warning("program not validate"); gl.glGetProgramiv(handle,GL2.GL_INFO_LOG_LENGTH,0); byte[] log = new byte[buffer[0]]; gl.glGetProgramInfoLog(handle,int handle) { int[] buffer = new int[1]; gl.glGetProgramiv(handle,GL2.GL_COMPILE_STATUS,0); if (buffer[0] == GL.GL_FALSE) { warning("error compiling shader"); } gl.glGetProgramiv(handle,0); byte[] log = new byte[buffer[0]]; if(log.length>0) gl.glGetShaderInfoLog(handle,0); if(log.length>0) if (log[0] != 0) warning("compiler info log:n" + new String(log,log.length - 1)); } 我得到这个日志; Loading Vertex Shader error compiling shader Loading Fragment Shader error compiling shader error linking program program not validate 解决方法
正如我在您的日志不是GLSL编译/链接日志之前写的那样,你已经搞砸了某个地方.当我将着色器放入我的引擎时,这里是nVidia环境的日志:
[Vertex] OK [Fragment] OK 0(9) : warning C7533: global variable gl_FragColor is deprecated after version 120 [Program] Linker error Fragment info ------------- 0(9) : warning C7533: global variable gl_FragColor is deprecated after version 120 error: user-defined fragment shader outputs may not be used with gl_FragColor or gl_FragData 因此,将片段着色器更改为: #version 400 core in vec3 colour; out vec4 out_Color; void main(void){ out_Color = vec4(colour,1.0); } 通过删除gl_FragColor = vec4(颜色,1.0);因为你已经设置了输出颜色.您可以只执行一次…如果您仍需要旧样式变量,则使用兼容性配置文件而不是核心 检查一下:glGetShaderInfoLog 我敢打赌,您正在调用由您链接到程序的任何基于gl的库提供的不同glGetShaderInfoLog.这就是为什么你有这些奇怪的消息而不是编译/链接日志.尝试使用原始的gl,它直接从gfx驱动程序返回日志… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |