Android OpenGL GLSL着色器问题
我制作的glsl着色器有问题。问题是,当我调用glCreateShader(type)-(这是compileShader方法的开头,类型是片段着色器或顶点着色器(我尝试了两者)时,它返回0,并且我还重新生成了着色器,以便在着色器代码错误的情况下它们非常基本,但这没有帮助 在我的onSurfaceCreated方法中,我最后有以下代码:Android OpenGL GLSL着色器问题,android,opengl-es,glsl,Android,Opengl Es,Glsl,我制作的glsl着色器有问题。问题是,当我调用glCreateShader(type)-(这是compileShader方法的开头,类型是片段着色器或顶点着色器(我尝试了两者)时,它返回0,并且我还重新生成了着色器,以便在着色器代码错误的情况下它们非常基本,但这没有帮助 在我的onSurfaceCreated方法中,我最后有以下代码: String vertexShaderSource = readTextFileFromResource(this.context, R.raw.vert
String vertexShaderSource = readTextFileFromResource(this.context, R.raw.vertex_shader);
String fragmentShaderSource = readTextFileFromResource(this.context, R.raw.fragment_shader);
shaderProgram = buildProgram(vertexShaderSource, fragmentShaderSource);
读取文件的方法:
public String readTextFileFromResource(Context context, int resourceId)
{
StringBuilder body = new StringBuilder();
try
{
InputStream inputStream = context.getResources().openRawResource(resourceId);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String nextLine;
while((nextLine = bufferedReader.readLine()) != null)
{
body.append(nextLine);
body.append('\n');
}
}catch (IOException ioe)
{
throw new RuntimeException("Could not open resource: " +resourceId, ioe);
}catch (Resources.NotFoundException nfe)
{
throw new RuntimeException("Resource not found: " + resourceId, nfe);
}
return body.toString();
}
buildProgram代码首先编译着色器:
int fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentSource);
int vertexShader = compileShader(GL_VERTEX_SHADER, vertexSource);
片段和顶点着色器:
void main(void)
{
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}
void main(void)
{
gl_Position = gl_Vertex;
}
如果您需要任何不确定的信息或更多信息,请让我知道,此时着色器在创建着色器时卡住了
编辑:添加代码:
private int compileShader(int type, String shaderCode)
{
int shaderHandle = glCreateShader(type);
if(shaderHandle != 0)
{
// Pass the shader source
glShaderSource(shaderHandle, shaderCode);
// ^Upload our shader source code into the shader
// Compile shader
glCompileShader(shaderHandle);
// Check compilation status
final int[] compileStatus = new int[1];
glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, compileStatus, 0);
if(compileStatus[0] == 0)
{
glDeleteShader(shaderHandle);
shaderHandle = 0;
Log.d(TAG, "Compilation of shader failed");
}
else
{
Log.d(TAG, "Compilation of shader successful");
}
}
if(shaderHandle == 0)
{
Log.d(TAG, "Context: "+this.context);
throw new RuntimeException("Error creating shader");
}
return shaderHandle;
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
loadGLTexture(gl, this.context);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
gl.glClear(GL10.GL_DEPTH_BUFFER_BIT);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
String vertexShaderSource = readTextFileFromResource(this.context, R.raw.vertex_shader);
String fragmentShaderSource = readTextFileFromResource(this.context, R.raw.fragment_shader);
shaderProgram = buildProgram(vertexShaderSource, fragmentShaderSource);
}
在尝试调用GL函数时,请确保您具有有效的GL上下文。顶点着色器看起来无效,OpenGL ES没有预定义的
GL\u vertex
变量。但在任何情况下,您都没有显示发生错误的代码,因此无法确定到底出了什么问题。它真的是glCreateShader()
返回0,还是着色器编译失败?@RetoKoradi在我共享的方法中发生错误,我已检查glCreateShader()中的变量是否为0,如果为0,则抛出RunTimeException,这就是错误显示的位置。我还显示了我尝试编译着色器的位置。关于顶点着色器,我确实尝试查找了一些基本着色器,这是其中之一,但如果它错了,我将如何更正它?@sandmaster:你说错误发生在编译器着色器中,但你未粘贴其代码。如果glCreateShader
返回0,则此时您很可能没有有效的GL上下文(调用线程当前有此上下文)。另一个选项是GL\u OUT\u MEMORY
情况,但后者不太可能。@derhass添加了缺少的内容,希望能有所帮助。