Java 为什么赢了';我的纹理渲染不好吗?
由于某些原因,我加载的纹理不会显示/渲染。我已经在以前的项目中使用了几乎相同的代码来渲染纹理,但由于某些原因,它不会使用下面的代码进行渲染。我已经发布了init()和createGreenFields()方法,display方法调用gl.glCallList(1)来创建字段Java 为什么赢了';我的纹理渲染不好吗?,java,opengl,textures,jogl,texture2d,Java,Opengl,Textures,Jogl,Texture2d,由于某些原因,我加载的纹理不会显示/渲染。我已经在以前的项目中使用了几乎相同的代码来渲染纹理,但由于某些原因,它不会使用下面的代码进行渲染。我已经发布了init()和createGreenFields()方法,display方法调用gl.glCallList(1)来创建字段 public void init(GLAutoDrawable drawable) { // Initialize object state. glu = new GLU(); GL2 gl = d
public void init(GLAutoDrawable drawable) {
// Initialize object state.
glu = new GLU();
GL2 gl = drawable.getGL().getGL2();
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glShadeModel(GL2.GL_SMOOTH);
try {
grassTex = TextureIO.newTexture(new File(grassFile), true);
grassTex.setTexParameteri(gl, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
grassTex.setTexParameteri(gl, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
} catch (Exception e) {
System.out.println("Error loading texture " + e);
}
gl.glClearDepth(1.0f);
createGreenFields(gl);
}
.
.
.
private void createGreenFields(GL2 gl) {
int index = gl.glGenLists(1);
gl.glNewList(index, GL2.GL_COMPILE);
gl.glBegin(GL2.GL_QUADS); // Four vertices
.
.
// do not draw the transparent parts of the texture
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
// don't show source alpha parts in the destination
// determine which areas of the polygon are to be rendered
gl.glEnable(GL2.GL_ALPHA_TEST);
gl.glAlphaFunc(GL.GL_GREATER, 0); // only render if alpha > 0
gl.glDisable(GL.GL_BLEND);
// enable texturing
//gl.glEnable(GL2.GL_TEXTURE_3D);
grassTex.enable(gl);
grassTex.bind(gl);
// replace the quad colors with the texture
gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
TextureCoords tc = grassTex.getImageTexCoords();
// lower right field
gl.glColor3f(0.0f, 0.3f, 0.0f); // Dark Green
gl.glTexCoord2f(tc.left(), tc.bottom());
gl.glVertex3f(-1.66f, 15.0f, 0f);
gl.glTexCoord2f(tc.right(), tc.bottom());
gl.glVertex3f(-15.0f, 15.0f, 0f);
gl.glTexCoord2f(tc.right(), tc.top());
gl.glVertex3f(-15.0f, 1.66f, 0f);
gl.glTexCoord2f(tc.left(), tc.top());
gl.glVertex3f(-1.66f, 1.66f, 0f);
.
.
public void display(GLAutoDrawable drawable) {
.
.
gl.glCallList(1); // Creates Green Fields
.
.
}
问题的出现是因为您调用这两个OpenGL函数的方式
glBegin(GL_QUADS);
... etc ...
glEnd();
调用glBegin()
后,您只能使用以下OpenGL函数,直到调用glEnd()
glVertex()
glColor()
glSecondaryColor()
glIndex()
glNormal()
glFogCoord()
glTexCoord()
glMultiTexCoord()
glVertexAttrib()
glEvalCoord()
glEvalPoint()
glArrayElement()
glMaterial()
glEdgeFlag()
glCallList()
glCallLists()
glEnable()
,glDisable()
,glBlendFunc()
,glAlphaFunc()
,并绑定纹理等。在调用glBegin()
之前,您需要执行所有这些操作
额外的
此外,如果您不知道,您正在使用不推荐的OpenGL函数。您应该学习和使用,还应该学习使用OpenGL中的现代功能和做事方式。我不认为坚持使用旧的即时模式渲染不利于OpenGL入门。别误会,你不应该永远呆在那里(也不会考虑它有多慢),但特别是对于刚接触编程和内存管理的人来说,这是一个伟大的垫脚石。@jozxyqk我完全同意你的看法!