2017-06-16 167 views
1

我的目标是使用着色器创建虚线。我已经定义了一维纹理,我认为它应该被应用,但是我所有的线条都是黑色的。我希望有一些简单的我只是想念。无法创建将纹理应用于OpenGL中的线条

我的线的顶点着色器:

#version 330 core 

layout (location = 0) in vec2 iPosition; 

uniform mat4 transform; 

void main() { 
    gl_Position = transform * vec4(iPosition, 0.0, 1.0); 
} 

我的几何形状着色器:

#version 330 core 

layout(lines) in; 
layout(line_strip, max_vertices=2) out; 

out float texCoord; 

void main() 
{ 
    gl_Position = gl_in[0].gl_Position; 
    texCoord = 0.0f; 
    EmitVertex(); 
    gl_Position = gl_in[1].gl_Position; 
    texCoord = 1.0f; 
    EmitVertex(); 
} 

我的片段着色器:

#version 330 core 

uniform sampler1D pattern; 

layout (location = 0) out vec4 fragColor; 
in float texCoord; 

void main() { 
    fragColor = texture(pattern, texCoord); 
} 

我的代码:

int[] textures = new int[1]; 
gl4.glGenTextures(1, textures, 0); 
int textureId = textures[0]; 
gl4.glActiveTexture(GL4.GL_TEXTURE0); 
gl4.glBindTexture(GL4.GL_TEXTURE_1D, textureId); 

ByteBuffer pixels = Buffers.newDirectByteBuffer(64 * 4 * 4); 
float full = Float.MAX_VALUE; 
float empty = 0f; 

//opaque red. 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full);  

//transparent green. 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 

//opaque red 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 

//transparent green. 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 
pixels.putFloat(full); 
pixels.putFloat(empty); 
pixels.putFloat(empty); 

pixels.flip(); 
gl4.glTexParameteri(GL4.GL_TEXTURE_1D, GL4.GL_TEXTURE_WRAP_S, GL4.GL_REPEAT); 
gl4.glTexParameteri(GL4.GL_TEXTURE_1D, GL4.GL_TEXTURE_WRAP_T, GL4.GL_REPEAT); 

gl4.glTexParameteri(GL4.GL_TEXTURE_1D, GL4.GL_TEXTURE_MIN_FILTER, GL4.GL_NEAREST); 
gl4.glTexParameteri(GL4.GL_TEXTURE_1D, GL4.GL_TEXTURE_MAG_FILTER, GL4.GL_NEAREST); 
gl4.glTexImage1D(GL4.GL_TEXTURE_1D, 0, 4, 32, 0, GL.GL_RGBA, GL.GL_FLOAT, pixels); 

    for (MapLayerData mapLayerData : mapLayerDataList) { 
    List<Line> lines = mapLayerData.getLines(); 
    for (int x = 0; x < lines.size(); x++){ 
     Line line = lines.get(x); 
     ArrayList<Point2D.Float> points = line.getPoints(); 

     for (Point2D.Float point : points) { 
      vertBuffer.putFloat((float) point.x); 
      vertBuffer.putFloat((float) point.y); 
     } 
     vertBuffer.flip(); 

     int[] bufferPointers = new int[1]; 
     gl4.glGenBuffers(1, bufferPointers, 0); 

     gl4.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferPointers[0]); 
     gl4.glBufferData(GL.GL_ARRAY_BUFFER, (points.size() * 8), vertBuffer, GL.GL_DYNAMIC_DRAW); 

     gl4.glVertexAttribPointer(0, 2, GL.GL_FLOAT, false, 8, 0); 
     gl4.glEnableVertexAttribArray(0); 

     gl4.glUniformMatrix4fv(lineTransformPointer, 1, false, transform.getMatrix(), 0); 
     gl4.glUniform1i(patternPointer, 0); 
     gl4.glDrawArrays(GL.GL_LINE_STRIP, 0, points.size()); 

     gl4.glBindBuffer(GL.GL_ARRAY_BUFFER, 0); 
     gl4.glDeleteBuffers(bufferPointers.length, bufferPointers, 0); 
     vertBuffer.clear(); 
    } 
    } 
    gl4.glDeleteTextures(1, textures,0); 
+0

你的'glUniform1i()'调用填充'pattern'在哪里? – genpfault

+0

我已经添加了对glActiveTexture和glUniform1i的调用,但是我仍然没有看到正在应用的纹理。我已经更新了上面的代码。我错过了一个电话或概念吗? – Sechanris

+0

几何着色器的要点是什么?这是完全多余的。 – derhass

回答

0
  • 4对于Core上下文中的glTexImage1D()不是有效的internalFormat
  • 没有证据表明您拥有VAO界限。这些在核心环境中是必需的。
  • 对1D纹理的GL_TEXTURE_WRAP_T没有理由。
  • 不知道什么patternPointer是。
+0

谢谢。将glTexImage1D的调用改为'gl4.glTexImage1D(GL4.GL_TEXTURE_1D,0,GL.GL_RGBA,32,0,GL.GL_RGBA,GL.GL_BYTE,像素);'得到要显示的纹理。 – Sechanris