/ / LWJGL Texturing - Java, opengl, lwjgl

LWJGL Texturierung - Java, OpenGL, Lwjgl

import static org.lwjgl.glfw.GLFW.*;
import  static org.lwjgl.opengl.GL11.*;
import  static org.lwjgl.opengl.GL20.*;
import  static org.lwjgl.opengl.GL30.*;
import java.awt.image.BufferedImageFilter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import  static org.lwjgl.opengl.GL15.*;

import org.lwjgl.BufferUtils;
import org.lwjgl.glfw.GLFWCursorPosCallback;
import org.lwjgl.glfw.GLFWKeyCallback;
import   org.lwjgl.opengl.GL;


public class test {
public static int program;
public static int vid,aid,iid,count,tid;
public static void main(String args[]) throws IOException {

glfwInit();
long window =  glfwCreateWindow(1920, 1080, "HI", 0 , 0);


glfwShowWindow(window);


glfwMakeContextCurrent(window);


GL.createCapabilities();
TextureLoader texture = new TextureLoader(new File("D:/work/opengl2/src/opengl2/no.png"));
while (!glfwWindowShouldClose(window))
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
new test().bind();


glBindVertexArray(aid);

glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iid);
texture.bind();

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT,0);


glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);



glfwSwapBuffers(window);
glfwPollEvents();
}

}







//bind the data

public void bind()
{
float[] vertices = {
-0.5f, 0.5f, 0f,    // Left top         ID: 0
-0.5f, -0.5f, 0f,   // Left bottom      ID: 1
0.5f, -0.5f, 0f,    // Right bottom     ID: 2
0.5f, 0.5f, 0f  // Right left       ID: 3
};

int[] indices =  new int[]
{
0, 1, 2,
2, 3, 0
};

float[] coords = new float[]{
0,0,
0,1,
1,1,
1,0

};

count = indices.length;
//create buffers
FloatBuffer texture = BufferUtils.createFloatBuffer(coords.length);
texture.put(coords);
texture.flip();
FloatBuffer vert = BufferUtils.createFloatBuffer(vertices.length);
vert.put(vertices);
vert.flip();

IntBuffer indic = BufferUtils.createIntBuffer(indices.length);
indic.put(indices);
indic.flip();

//bind the VAO
aid = glGenVertexArrays();
glBindVertexArray(aid);
vid = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vid);
glBufferData(GL_ARRAY_BUFFER, vert, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

tid = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, tid);
glBufferData(GL_ARRAY_BUFFER, texture, GL_STATIC_DRAW);
glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER,0);

glBindVertexArray(0);


iid = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iid);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indic, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);


}

}

Hallo Leute! Ich versuche, ein Polygon zu texturieren, aber wenn ich diesen Code ausführe, zeigt es mir ein Rechteck mit einer seltsamen Farbe, wie wenn die Texturkoordinaten nicht gut für das Rechteck sind. Ich binde die Texturkoordinaten an das VertexAttribArray und rufe es dann in der Hauptspielschleife an. Ich habe viele Tutorials gesehen, aber niemand hat es mit den Indizes gemacht. Ich binde die Indizes nicht in ein Attribut, sondern setze sie normalerweise in einen VBO und rufe sie dann vor den glDrawElements auf. Danke im Voraus! PS: Ich bin neu in diesem lwjgl Kapitel, also nimm mich einfach :)

Antworten:

0 für die Antwort № 1

Ich kenne OpenGL 2 nicht wirklich, wie es scheintWas Sie verwenden. Es gibt mehrere Dinge, die ich ändern würde (wie unten aufgeführt), aber ich empfehle Ihnen, zu OpenGL 3 und neuer zu wechseln. Es ist viel aktueller und flexibler. Wenn Sie Tutorials dazu benötigen, kann ich diejenigen von ThinMatrix empfehlen (https://www.youtube.com/user/ThinMatrix).

Da ich nur OpenGL 3 und neuer kenne, was ich dir sage, ist es vielleicht nicht korrekt, aber versuche es:

  • Ziehen um new test().bind(); außerhalb Ihrer Hauptschleife
  • Versuchen Sie, Ihren VAO zu lösen nach Ihr Indexpuffer wurde mit Daten gefüllt