java - GLSL 错误意外 $end at token ""和格式问题
问题描述
所以我有一个使用opengl来绘制三角形并让它做各种事情的任务。我的顶点着色器文件有问题由于某种原因,如果我尝试在着色器文件中插入新行,它会中断并且不显示三角形。例如,如果我换行。
#version 430
out vec4 varyingColor;
uniform float offsetV;
uniform int gradientChange;
uniform float size;
uniform float offsetCx;
uniform float offsetCy;
这将打破,它将不再显示三角形。但是当我将它们全部放在一行中时,我得到一个错误但是我得到了代码的全部功能,三角形显示,它移动等等。
(0) : 错误 C0000: 语法错误,意外 $end at token ""
这是我的顶点着色器
#version 430
out vec4 varyingColor;uniform float offsetV;uniform int gradientChange;uniform float size;uniform float offsetCx; uniform float offsetCy;
void main(void){
if(gl_VertexID==0){gl_Position= vec4(size*(0.25)+offsetCx,size*(-0.25+offsetV)+offsetCy,0.0,1.0);}
if(gl_VertexID==1){gl_Position=vec4(size*(-0.25)+offsetCx,size*(-0.25+offsetV)+offsetCy,0.0,1.0);}
if(gl_VertexID==2){gl_Position=vec4(size*(0.0)+offsetCx,size*(0.25+offsetV)+offsetCy,0.0,1.0);}
if(gradientChange == 0){varyingColor = vec4( 1.0,0.0,0.0,1.0); }
}
这是我的片段着色器
#version 430
out vec4 color;
in vec4 varyingColor;
void main(void){
color = varyingColor;
}
private int createShaderProgram() {
GL4 gl = (GL4) GLContext.getCurrentGL();
int[] vertCompiled = new int[1];
int[] fragCompiled = new int[1];
int[] linked = new int[1];
String vshaderSource [];
String fshaderSource [];
vshaderSource = readShaderSource("src/code/vertShader.glsl");
fshaderSource = readShaderSource("src/code/fragShader.glsl");
int vShader = gl.glCreateShader(GL_VERTEX_SHADER);
gl.glShaderSource(vShader, 3, vshaderSource, null, 0);
gl.glCompileShader(vShader);
//catch error code chunks
checkOpenGLError();
gl.glGetShaderiv(vShader, GL_COMPILE_STATUS, vertCompiled, 0);
if(vertCompiled[0] !=1) {
System.out.println("vertext compilation failed.");
printShaderLog(vShader);
}
int fShader=gl.glCreateShader(GL_FRAGMENT_SHADER);
gl.glShaderSource(fShader, 4, fshaderSource, null, 0);
gl.glCompileShader(fShader);
//catch error code chunks
checkOpenGLError();
gl.glGetShaderiv(fShader, GL_COMPILE_STATUS, fragCompiled, 0);
if(fragCompiled[0] !=1) {
System.out.println("fragment compilation failed.");
printShaderLog(fShader);
}
if((vertCompiled[0] !=1) ||((fragCompiled[0] !=1))) {
System.out.println("\nCompilation Error; return-flags:");
System.out.println("vertCompiled = " +vertCompiled[0] + "; fragCompiled " + fragCompiled[0]);
}
gl.glShaderSource(vShader, vshaderSource.length, vshaderSource, null, 0);
gl.glShaderSource(fShader, vshaderSource.length, vshaderSource, null, 0);
int vfProgram = gl.glCreateProgram();
gl.glAttachShader(vfProgram, vShader);
gl.glAttachShader(vfProgram, fShader);
gl.glLinkProgram(vfProgram);
gl.glDeleteShader(vShader);
gl.glDeleteShader(fShader);
return vfProgram;
}
解决方案
问题是线路
gl.glShaderSource(vShader, 3, vshaderSource, null, 0);
分别
gl.glShaderSource(fShader, 4, fshaderSource, null, 0);
vshaderSource
并且fshaderSource
是字符串数组 ( String[]
)。glShaderSource
可以得到一个字符串数组。但是您必须将数组的长度设置为第二个参数:
gl.glShaderSource(vShader, vshaderSource.length, vshaderSource, null, 0);
gl.glShaderSource(fShader, fshaderSource.length, fshaderSource, null, 0);
推荐阅读
- sql-server - SQL 关键字“AS”的用途是什么?
- java - 私有静态函数不能使用参数,因为在while循环中使用了参数,所以如何解决这个问题?
- mongodb - 如何从所有 MongoDB 记录中仅获取几个字段
- python - django安全模板过滤器定制
- matlab - 如何在matlab中绘制一条垂直线?
- c# - 调用我的 webapi 时收到 400 错误请求
- php - 如何使用 htaccess 删除 url 中的 index.php
- python - 如何提高我的功能的效率?
- reactjs - 错误:构建 react-static 应用程序模板时出现“模块解析失败:意外令牌”
- database - 表示关系