[Java / LWJGL] Buffer Problem

09/11/2013 20:46 'ChuckNorris#1
Hallo Leute,

Ich hab ein kleines Problem mit Buffer.
Ich habe schon öfter was mit LWJGL gemacht allerdings immer nur ohne Buffer und ohne DrawElements sondern halt einfach mit glVertex2i und so.

Das Quad zeichnen tut er schon allerdings in weiß obwohl ich eigentlich Farbe definiert habe.

Erstellen der Buffers:
PHP Code:
        float[] vertices = {
                -
0.5f0.5f0f1f,    // Left top            ID: 0
                
-0.5f, -0.5f0f1f,    // Left bottom        ID: 1
                
0.5f, -0.5f0f1f,    // Right bottom        ID: 2
                
0.5f0.5f0f1f         // Right left        ID: 3
        
};
        
        
// Sending data to OpenGL requires the usage of (flipped) byte buffers
        
FloatBuffer verticesBuffer BufferUtils.createFloatBuffer(vertices.length);
        
verticesBuffer.put(vertices);
        
verticesBuffer.flip();
        
        
float[] colors = {
                
1f0f0f1f,
                
0f1f0f1f,
                
0f0f1f1f,
                
1f1f1f1f
        
};
        
        
FloatBuffer colorsBuffer BufferUtils.createFloatBuffer(colors.length);
        
colorsBuffer.put(colors);
        
colorsBuffer.flip();
        
        
byte[] indices = {
                
// Left bottom triangle
                
012,
                
// Right top triangle
                
230
        
};
        
int indicesCount indices.length;
        
ByteBuffer indicesBuffer BufferUtils.createByteBuffer(indicesCount);
        
indicesBuffer.put(indices);
        
indicesBuffer.flip();
        
        
int vaoId GL30.glGenVertexArrays();
        
GL30.glBindVertexArray(vaoId);
        
        
int vboId GL15.glGenBuffers();
        
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFERvboId);
        
GL15.glBufferData(GL15.GL_ARRAY_BUFFERverticesBufferGL15.GL_STATIC_DRAW);
        
GL20.glVertexAttribPointer(04GL11.GL_FLOATfalse00);
        
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER0);
        
        
int bufColorsId GL15.glGenBuffers();
        
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFERbufColorsId);
        
GL15.glBufferData(GL15.GL_ARRAY_BUFFERcolorsBufferGL15.GL_STATIC_DRAW);
        
GL20.glVertexAttribPointer(14GL11.GL_FLOATfalse00);
        
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER0);
        
        
GL30.glBindVertexArray(0);
        
        
int vboiId GL15.glGenBuffers();
        
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFERvboiId);
        
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFERindicesBufferGL15.GL_STATIC_DRAW);
        
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER0); 
Loop:
PHP Code:
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        
        
GL20.glUseProgram(pId);
        
        
GL30.glBindVertexArray(vaoId);
        
GL20.glEnableVertexAttribArray(0);
        
GL20.glEnableVertexAttribArray(1);
        
        
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFERvboiId);
        
        
GL11.glDrawElements(GL11.GL_TRIANGLESindicesCountGL11.GL_UNSIGNED_BYTE0);
        
        
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER0);
        
GL20.glDisableVertexAttribArray(0);
        
GL20.glDisableVertexAttribArray(1);
        
GL30.glBindVertexArray(0);
        
GL20.glUseProgram(0); 
Shader Init:
PHP Code:
        vsId ShaderLoader.load("res/shaders/color_vertex.glsl"GL20.GL_VERTEX_SHADER);
        
fsId ShaderLoader.load("res/shaders/color_fragment.glsl"GL20.GL_FRAGMENT_SHADER);
        
pId GL20.glCreateProgram();
        
GL20.glAttachShader(pIdvsId);
        
GL20.glAttachShader(pIdfsId);
        
GL20.glBindAttribLocation(pId0"in_Position");
        
GL20.glBindAttribLocation(pId1"in_Color");
        
GL20.glLinkProgram(pId);
        
GL20.glValidateProgram(pId); 
color_vertex.glsl:
PHP Code:
#version 150 core

in vec4 in_Position;
in vec4 in_Color;

out vec4 pass_Color;

void main(void) {
  
gl_Position in_Position;
  
pass_Color inColor;

color_fragment.glsl:
PHP Code:
#version 150 core

in vec4 pass_Color;

out vec4 out_Color;

void main(void) {
  
out_Color pass_Color;

Wäre cool wenn jemand zufällig sieht was ich falsch mache.

Gruß,
Chuck
09/11/2013 21:40 endless90#2
wunder dich nicht die seite behandelt opengl unter c++. das ganze laesst sich aber recht einfach in java uebertragen. [Only registered and activated users can see links. Click Here To Register...] stichwort attribute. ich habe es bisher noch nicht gesehen das man ein extra color buffer erstellt.

normalerweise fuellst du deinen vertex buffer in etwa so:

{
x,y,z,r,g,b //vertex 1
x,y,z,r,g,b //vertex 2
x,y,z,r,g,b //vertex 3
}

und mit den attributen sagst du dann wie dein buffer ueberhaupt aufgebaut ist. in diesem fall eben 3 positions- und 3 farbkomponenten.