加载着色器时Java崩溃

时间:2014-10-22 11:03:47

标签: java opengl glsl lwjgl

(哦,这个问题在“新lwjgl问题”的电子邮件列表中得到了 - 很棒)

我正在尝试加载一些着色器。

但是当我这样做时,java崩溃了:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x073af8f2, pid=17240, tid=16060
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) Client VM (24.51-b03 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [ig7icd32.dll+0x3df8f2]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\Downloads\mcp\ship\Ship\hs_err_pid17240.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

我将.log文件夹粘贴到http://pastebin.com/jnNd4UBi。但相关的一点是:

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.lwjgl.opengl.GL20.nglLinkProgram(IJ)V+0
j  org.lwjgl.opengl.GL20.glLinkProgram(I)V+15
j      utility.ShaderLoader.loadShaderPair(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/S tring;)I+887
j  Joehot200.TerrainDemo.setUpShaders()V+12
j  Joehot200.TerrainDemo.startGame()V+43
j  StartScreenExperiments.Test2.resartTDemo()V+21
j  StartScreenExperiments.Test2.main([Ljava/lang/String;)V+10
v  ~StubRoutines::call_stub

所以相关部分是“glLinkProgram”,它表明当我尝试链接已编译的着色器时发生了崩溃。

我的LoadShaderPair()方法包含以下内容:

 public static int loadShaderPair(String vertexShaderLocation, String fragmentShaderLocation,   String tesShaderLocation, String tesscontrolShaderLocation) {
    int shaderProgram = glCreateProgram();
    int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    int tesscontrolShader = glCreateShader(GL40.GL_TESS_CONTROL_SHADER);
    int tesShader = glCreateShader(GL40.GL_TESS_EVALUATION_SHADER);
    StringBuilder vertexShaderSource = new StringBuilder();
    StringBuilder fragmentShaderSource = new StringBuilder();
    StringBuilder tesShaderSource = new StringBuilder();
    StringBuilder tesscontrolShaderSource = new StringBuilder();
    BufferedReader tesShaderFileReader = null;
    try {
        tesShaderFileReader = new BufferedReader(new FileReader(tesShaderLocation));
        String line;
        while ((line = tesShaderFileReader.readLine()) != null) {
            tesShaderSource.append(line).append('\n');
        }
    } catch (IOException e) {
        e.printStackTrace();
        return -1;
    } finally {
        if (tesShaderFileReader != null) {
            try {
                tesShaderFileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    BufferedReader tesscontrolShaderFileReader = null;
    try {
        tesscontrolShaderFileReader = new BufferedReader(new FileReader(tesscontrolShaderLocation));
        String line;
        while ((line = tesscontrolShaderFileReader.readLine()) != null) {
            tesscontrolShaderSource.append(line).append('\n');
        }
    } catch (IOException e) {
        e.printStackTrace();
        return -1;
    } finally {
        if (tesscontrolShaderFileReader != null) {
            try {
                tesscontrolShaderFileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    BufferedReader vertexShaderFileReader = null;
    try {
        vertexShaderFileReader = new BufferedReader(new FileReader(vertexShaderLocation));
        String line;
        while ((line = vertexShaderFileReader.readLine()) != null) {
            vertexShaderSource.append(line).append('\n');
        }
    } catch (IOException e) {
        e.printStackTrace();
        return -1;
    } finally {
        if (vertexShaderFileReader != null) {
            try {
                vertexShaderFileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    BufferedReader fragmentShaderFileReader = null;
    try {
        fragmentShaderFileReader = new BufferedReader(new FileReader(fragmentShaderLocation));
        String line;
        while ((line = fragmentShaderFileReader.readLine()) != null) {
            fragmentShaderSource.append(line).append('\n');
        }
    } catch (IOException e) {
        e.printStackTrace();
        return -1;
    } finally {
        if (fragmentShaderFileReader != null) {
            try {
                fragmentShaderFileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    glShaderSource(vertexShader, vertexShaderSource);
    glCompileShader(vertexShader);
    System.out.println(glGetShaderi(vertexShader, GL_COMPILE_STATUS) == GL11.GL_TRUE);
    if (glGetShaderi(vertexShader, GL_COMPILE_STATUS) == GL_FALSE) {
        System.err.println("Vertex shader wasn't able to be compiled correctly. Error log:");
        //try{
        System.err.println(glGetShaderInfoLog(vertexShader, 1024));
        return -1;
    }
    glShaderSource(tesscontrolShader, tesscontrolShaderSource);
    glCompileShader(tesscontrolShader);
    System.out.println(glGetShaderi(tesscontrolShader, GL_COMPILE_STATUS) == GL11.GL_TRUE);
    if (glGetShaderi(tesscontrolShader, GL_COMPILE_STATUS) == GL_FALSE) {
        System.err.println("tesscontrol shader wasn't able to be compiled correctly. Error log:");
        System.err.println(GL11.glGetString(GL11.glGetError()));
        System.err.println(glGetShaderInfoLog(tesscontrolShader, 1024));
    }
    glShaderSource(fragmentShader, fragmentShaderSource);
    glCompileShader(fragmentShader);
    System.out.println(glGetShaderi(fragmentShader, GL_COMPILE_STATUS) == GL11.GL_TRUE);
    if (glGetShaderi(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE) {
        System.err.println("Fragment shader wasn't able to be compiled correctly. Error log:");
        System.err.println(GL11.glGetString(GL11.glGetError()));
        System.err.println(glGetShaderInfoLog(fragmentShader, 1024));
    }
    glShaderSource(tesShader, tesShaderSource);
    glCompileShader(tesShader);
    System.out.println(glGetShaderi(tesShader, GL_COMPILE_STATUS) == GL11.GL_TRUE);
    if (glGetShaderi(tesShader, GL_COMPILE_STATUS) == GL_FALSE) {
        System.err.println("Tessellation shader wasn't able to be compiled correctly. Error log:");
        System.err.println(glGetShaderInfoLog(tesShader, 1024));
        return -1;
    }









    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, tesShader);
    glAttachShader(shaderProgram, tesscontrolShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    System.err.println(glGetProgramInfoLog(shaderProgram, 1024));
    if (glGetProgrami(shaderProgram, GL_LINK_STATUS) == GL_FALSE) {
        System.err.println("Shader program wasn't linked correctly.");
        System.err.println(GL11.glGetString(GL11.glGetError()));
        System.exit(1);
        return -1;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
    glDeleteShader(tesShader);
    glDeleteShader(tesscontrolShader);
    return shaderProgram;
}

我的顶点着色器是这样的:

layout(triangles, equal_spacing, ccw) in;

uniform mat4 gVP;
uniform sampler2D gDisplacementMap;
uniform float gDispFactor;

in vec3 WorldPos_ES_in[];
in vec2 TexCoord_ES_in[];
in vec3 Normal_ES_in[];

out vec3 WorldPos_FS_in;
out vec2 TexCoord_FS_in;
out vec3 Normal_FS_in;

vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2)
{
return vec2(gl_TessCoord.x) * v0 + vec2(gl_TessCoord.y) * v1 + vec2(gl_TessCoord.z) * v2;
}

vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2)
{
return vec3(gl_TessCoord.x) * v0 + vec3(gl_TessCoord.y) * v1 + vec3(gl_TessCoord.z) * v2;
}

void main()
{
// Interpolate the attributes of the output vertex using the barycentric coordinates
TexCoord_FS_in = interpolate2D(TexCoord_ES_in[0], TexCoord_ES_in[1], TexCoord_ES_in[2]);
Normal_FS_in = interpolate3D(Normal_ES_in[0], Normal_ES_in[1], Normal_ES_in[2]);
Normal_FS_in = normalize(Normal_FS_in);
WorldPos_FS_in = interpolate3D(WorldPos_ES_in[0], WorldPos_ES_in[1], WorldPos_ES_in[2]);
// Displace the vertex along the normal
float Displacement = texture(gDisplacementMap, TexCoord_FS_in.xy).x;
WorldPos_FS_in += Normal_FS_in * Displacement * gDispFactor;
gl_Position = gVP * vec4(WorldPos_FS_in, 1.0);
}

细分控制着色器:

// define the number of CPs in the output patch
layout (vertices = 3) out;

uniform vec3 gEyeWorldPos;

// attributes of the input CPs
in vec3 WorldPos_CS_in[];
in vec2 TexCoord_CS_in[];
in vec3 Normal_CS_in[];

// attributes of the output CPs
out vec3 WorldPos_ES_in[];
out vec2 TexCoord_ES_in[];
out vec3 Normal_ES_in[];

float GetTessLevel(float Distance0, float Distance1)
{
float AvgDistance = (Distance0 + Distance1) / 2.0;

if (AvgDistance <= 2.0) {
    return 10.0;
}
else if (AvgDistance <= 5.0) {
    return 7.0;
}
else {
    return 3.0;
}
}

void main()
{
// Set the control points of the output patch
TexCoord_ES_in[gl_InvocationID] = TexCoord_CS_in[gl_InvocationID];
Normal_ES_in[gl_InvocationID] = Normal_CS_in[gl_InvocationID];
WorldPos_ES_in[gl_InvocationID] = WorldPos_CS_in[gl_InvocationID];
// Calculate the distance from the camera to the three control points
float EyeToVertexDistance0 = distance(gEyeWorldPos, WorldPos_ES_in[0]);
float EyeToVertexDistance1 = distance(gEyeWorldPos, WorldPos_ES_in[1]);
float EyeToVertexDistance2 = distance(gEyeWorldPos, WorldPos_ES_in[2]);

// Calculate the tessellation levels
gl_TessLevelOuter[0] = GetTessLevel(EyeToVertexDistance1, EyeToVertexDistance2);
gl_TessLevelOuter[1] = GetTessLevel(EyeToVertexDistance2, EyeToVertexDistance0);
gl_TessLevelOuter[2] = GetTessLevel(EyeToVertexDistance0, EyeToVertexDistance1);
gl_TessLevelInner[0] = gl_TessLevelOuter[2];
}

细分评估着色器:

layout(triangles, equal_spacing, ccw) in;

uniform mat4 gVP;
uniform sampler2D gDisplacementMap;
uniform float gDispFactor;

in vec3 WorldPos_ES_in[];
in vec2 TexCoord_ES_in[];
in vec3 Normal_ES_in[];

out vec3 WorldPos_FS_in;
out vec2 TexCoord_FS_in;
out vec3 Normal_FS_in;

vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2)
{
return vec2(gl_TessCoord.x) * v0 + vec2(gl_TessCoord.y) * v1 + vec2(gl_TessCoord.z) * v2;
}

vec3 interpolate3D(vec3 v0, vec3 v1, vec3 v2)
{
return vec3(gl_TessCoord.x) * v0 + vec3(gl_TessCoord.y) * v1 + vec3(gl_TessCoord.z) * v2;
}

void main()
{
// Interpolate the attributes of the output vertex using the barycentric coordinates
TexCoord_FS_in = interpolate2D(TexCoord_ES_in[0], TexCoord_ES_in[1], TexCoord_ES_in[2]);
Normal_FS_in = interpolate3D(Normal_ES_in[0], Normal_ES_in[1], Normal_ES_in[2]);
Normal_FS_in = normalize(Normal_FS_in);
WorldPos_FS_in = interpolate3D(WorldPos_ES_in[0], WorldPos_ES_in[1], WorldPos_ES_in[2]);
// Displace the vertex along the normal
float Displacement = texture(gDisplacementMap, TexCoord_FS_in.xy).x;
WorldPos_FS_in += Normal_FS_in * Displacement * gDispFactor;
gl_Position = gVP * vec4(WorldPos_FS_in, 1.0);
}

片段着色器:

varying vec4 position_in_view_space;
uniform sampler2D color_texture;

     void main()
     {
        float dist = distance(position_in_view_space, 
           vec4(0.0, 0.0, 0.0, 1.0));
        if (dist < 1000.0)
        {
            gl_FragColor = gl_Color;
              // color near origin
        }
        else
        {
        gl_FragColor = gl_Color;
           //kill;
           //discard;
           //gl_FragColor = vec4(0.3, 0.3, 0.3, 1.0); 
              // color far from origin
        }
     }

我无法弄清楚出了什么问题。我知道这是着色器链接的一个问题,但我找不到为什么他们在链接时崩溃java,或者如何解决它。

如果有人能按预期工作,那将会很棒(预计会有更远的物体被给予更少的顶点)。

0 个答案:

没有答案
相关问题