2017-06-16 166 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