- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Java 将一些基本四边形渲染到 LWJGL 中的 FBO,但它实际上并未渲染,我不知道为什么。
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.EXTFramebufferObject;
import org.lwjgl.opengl.GLContext;
import org.newdawn.slick.Color;
import elec0.utils.Camera;
import elec0.utils.Vector2f;
import elec0.utils.Vector3f;
public class lwjglFBO
{
private Camera camera = new Camera();
private boolean running = true, wireframe = false;
private long lastFPS;
private int fps;
// boolean FBOEnabled = GLContext.getCapabilities().GL_EXT_framebuffer_object;
private int iFBOBuffer;
public void start()
{
initGL();
init();
lastFPS = getTime();
while(!Display.isCloseRequested())
{
updateFPS();
pollInput();
render();
Display.update();
Display.sync(60); // limit FPS to 60
}
Display.destroy();
System.exit(0);
}
private void render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/*gluLookAt(0, 0, 5, // Set up the LookAt
0, 0, 0,
0, 1, 0);*/
camera.render();
drawGrid(); // Render this fill, it's lines
int verts = 0;
EXTFramebufferObject.glBindFramebufferEXT( EXTFramebufferObject.GL_FRAMEBUFFER_EXT, iFBOBuffer );
glPushAttrib(GL_VIEWPORT_BIT);
glViewport( 0, 0, 800, 600);
glClear(GL_COLOR_BUFFER_BIT);
for(int z = 0; z < 20; ++z)
{
for(int y = 0; y < 20; ++y)
{
for(int x = 0; x < 20; ++x)
{
glPushMatrix();
glTranslatef(x, y, z);
drawBox();
// verts+=24;
glPopMatrix();
}
}
}
// System.out.println(verts);
EXTFramebufferObject.glBindFramebufferEXT( EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);
glPopAttrib();
// Render
if(wireframe)
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
else
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
}
private void drawBox()
{
/* draws the sides of a unit cube (0,0,0)-(1,1,1) */
glBegin(GL_POLYGON);/* f1: front */
glNormal3f(-1.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,0.0f,1.0f);
glVertex3f(1.0f,0.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);/* f2: bottom */
glNormal3f(0.0f,0.0f,-1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);/* f3:back */
glNormal3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(0.0f,1.0f,1.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);/* f4: top */
glNormal3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(1.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,1.0f,1.0f);
glEnd();
glBegin(GL_POLYGON);/* f5: left */
glNormal3f(0.0f,1.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(0.0f,1.0f,1.0f);
glVertex3f(0.0f,0.0f,1.0f);
glEnd();
glBegin(GL_POLYGON);/* f6: right */
glNormal3f(0.0f,-1.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(1.0f,1.0f,0.0f);
glEnd();
}
private void init()
{
Mouse.setGrabbed(true);
camera.initCamera();
camera.farPlane = 1000;
camera.initPerspective();
}
private void initGL()
{
try {
Display.setDisplayMode(new DisplayMode(800, 600));
Display.create();
Display.setVSyncEnabled(true);
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(0);
}
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black Background
glClearDepth(1.0); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
IntBuffer buffer = ByteBuffer.allocateDirect(1*4).order(ByteOrder.nativeOrder()).asIntBuffer(); // allocate a 1 int byte buffer
EXTFramebufferObject.glGenFramebuffersEXT( buffer ); // generate
iFBOBuffer = buffer.get();
// glEnable(GL_FOG);
// FloatBuffer fogColor = BufferUtils.createFloatBuffer(4);
// fogColor.put(0f).put(0f).put(0f).put(1f).flip();
//
// int fogMode = GL_LINEAR;
// glFogi(GL_FOG_MODE, fogMode);
// glFog(GL_FOG_COLOR, fogColor);
// glFogf(GL_FOG_DENSITY, 0.35f);
// glHint(GL_FOG_HINT, GL_DONT_CARE);
// glFogf(GL_FOG_START, 100.0f);
// glFogf(GL_FOG_END, 500.0f);
// Alpha blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
private long lastF;
private void pollInput()
{
int x = Mouse.getX();
int y = Display.getHeight() - Mouse.getY();
float speed = .1f;
int iKeypressSpeed = 50;
int iDelta = getDelta();
speed *= iDelta;
if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))
speed *= 4;
if(Keyboard.isKeyDown(Keyboard.KEY_W))
{
camera.MoveForwards(speed);
}
if(Keyboard.isKeyDown(Keyboard.KEY_S))
{
camera.MoveForwards(-speed);
}
if(Keyboard.isKeyDown(Keyboard.KEY_A))
{
camera.MoveRight(-speed);
}
if(Keyboard.isKeyDown(Keyboard.KEY_D))
{
camera.MoveRight(speed);
}
if(Keyboard.isKeyDown(Keyboard.KEY_SPACE))
{
camera.moveUp(speed);
}
if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
{
Display.destroy();
System.exit(0);
}
if(Keyboard.isKeyDown(Keyboard.KEY_P))
{
if(getTime() - lastF > iKeypressSpeed)
wireframe = !wireframe;
lastF = getTime();
}
if(Keyboard.isKeyDown(Keyboard.KEY_N))
{
if(getTime() - lastF > iKeypressSpeed)
lastF = getTime();
}
if(Keyboard.isKeyDown(Keyboard.KEY_C))
{
if(getTime() - lastF > iKeypressSpeed)
lastF = getTime();
}
checkMouseMove(x, y);
}
Vector2f previous = new Vector2f(), mousePos = new Vector2f();
private float MOUSE_SENSITIVITY = 4.0f;
private void checkMouseMove(float x, float y)
{
float DeltX, DeltY;
int centX = Display.getWidth()/2, centY = Display.getHeight()/2;
DeltX = (float)(centX - x) / MOUSE_SENSITIVITY;
DeltY = (float)(centY - y) / MOUSE_SENSITIVITY;
camera.Rotate(DeltY, DeltX, 0);
Mouse.setCursorPosition(centX, centY);
}
public long getTime()
{
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
}
public void updateFPS()
{
if (getTime() - lastFPS > 1000) {
Display.setTitle("FPS: " + fps);
fps = 0; //reset the FPS counter
lastFPS += 1000; //add one second
}
fps++;
}
long lastFrame;
public int getDelta()
{
long time = getTime();
int delta = (int) (time - lastFrame);
lastFrame = time;
return delta;
}
private void drawGrid()
{
glPushMatrix();
glDisable(GL_TEXTURE_2D);
glColor3f(0.25f, 0.25f, 0.25f);
float gridSize = 30;
int mX = 64, mZ = 64;
glTranslatef(-(mX+gridSize)/2, -5, -(mZ+gridSize)/2);
for(int x = 0; x < mX; ++x)
{
for(int z = 0; z < mZ; ++z)
{
glBegin(GL_LINE_LOOP);
glVertex3f(x, 0, z);
glVertex3f(x+gridSize, 0, z);
glVertex3f(x+gridSize, 0, z+gridSize);
glVertex3f(x, 0, z+gridSize);
glEnd();
}
}
glEnable(GL_TEXTURE_2D);
glPopMatrix();
}
public static void main(String[] args)
{
lwjglFBO city = new lwjglFBO();
city.start();
}
}
最佳答案
我花了一些时间查看你的代码,我可能只是错过了一些东西,但我找不到你在哪里获取 fbo 纹理并将其渲染在屏幕上的地方。
我看到了你绘制网格的位置以及绘制所有立方体的位置,但我没有看到任何东西绑定(bind)到任何立方体。
关于java - 在 LWJGL 中渲染到 FBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16468446/
我有以下 OpenGL 设置来解决帧缓冲区问题: 我将立方体渲染到帧缓冲区中。 我使用此帧缓冲区中的目标纹理绘制带纹理的四边形,它在我的视口(viewport)中显示立方体。 当流程的两个阶段都在同一
我一直在研究乒乓球着色,并认为在我上一个问题之后我已经破解了它。但是,随着对着色器的进一步了解,看起来虽然我能够在 FBO A 和 FBO B 上运行着色器,但 A 的输出并未用作 B 的源。换句话说
平台是iPhone OpenGL ES 2.0 框架已经创建了一个带有渲染缓冲区的主fbo,因为它是颜色附件。 我有自己的 fbo ,其中 texture2D 作为颜色附件。我想将主 fbo 的内容复
我有一个应用程序需要执行以下操作: 将纹理从磁盘加载到 GL 纹理 在其上运行图像过滤器(通过 FBO 将其渲染到另一个纹理上) 在屏幕上显示生成的纹理 我有那么多工作。 接下来,我希望能够将第 2
我正在尝试创建一个 FBO 来绘制 3D 场景,并创建另一个 FBO 来绘制 HUD。然后,我尝试通过将 3D 场景 block 传输到默认 FBO,然后将 HUD block 传输到默认 FBO,来
除了默认的帧缓冲区之外,在什么情况下我希望在 OpenGL FBO 中添加渲染缓冲区附件而不是纹理附件?因为,纹理附件似乎更加通用。 最佳答案 纹理为您提供更多功能(采样!、格式多样性),因此更有可能
我正在考虑重构我的渲染代码的很大一部分,然后我想到了一个问题:是否可以使用帧缓冲区对象中的多个颜色附件渲染到屏幕和纹理?尽管它有许多有用的应用程序,但我找不到任何信息是否可能。我想将我的纹理作为颜色a
我尝试在 OpenGL 中使用 FBO 的模板缓冲区,但无法正常工作。我将深度和模板目标的 depth24_stencil8 纹理绑定(bind)到 FBO。作为一个简单的测试,我尝试了: /* En
到目前为止,在对自定义 FBO 进行深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换它们(因为我需要在着色器中读取它)。我正在查看不同的来源,如 here并看到 GL_FLOAT 用作数据
我现在正在尝试实现阴影贴图几天,我想我开始看到手头的真正问题:我有一个附加了深度纹理的 FBO,用于阴影贴图的光 channel ,但是其中没有任何内容被渲染。甚至没有硬编码值。 我已经仔细检查了程序
我正在尝试关注 ThinMatrix's water tutorial 。为此,我需要创建一个 FBO 并将其渲染为纹理。 但是正如您所看到的,水是完全黑色的: 我正在使用source code pr
我正在使用 A FBO 捕捉四边形表面上方的反射。前提是将相机移动到水面下然后渲染场景到fbo,然后恢复到原来的观看位置,像这样: WaterFrameBuffer fbos; Water test(
我有一个按以下方式创建的 FBO: glGenRenderbuffers(1, &m_depthStencilBuffer); glBindRenderbuffer(GL_RENDERBUFFER,
我无法使用 glreadpixels 函数从深度纹理读取正确的深度值。 FBO 状态完成。其他渲染目标在传输到另一个 FBO 后看起来也很好。 代码片段: // Create the FBO
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我读到在分层渲染中,我们创建了一个 2D 纹理数组(GL_TEXTURE_2D_ARRAY): glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTU
我在网上看到了很多示例(for example),它们执行以下操作 创建和绑定(bind) FBO 创建和绑定(bind)缓冲区 (纹理、渲染、深度、模板) 然后,解除绑定(bind)缓冲区 要使用
我想使用片段着色器输出到 FBO,然后将其纹理附件绘制到默认帧缓冲区。最终,我希望能够输出到一个 FBO,然后使用另一个着色器将其传递给另一个 FBO,依此类推。但我认为让它在默认帧缓冲区上工作是一个
在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。 我想更新它,以便获得 Gamma 正确的结果。使用
我想将图像处理 OpenGL 着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用 glReadPixels() 保存窗口帧缓冲区。然而,屏幕的分辨率小于图像的尺寸。 如果我渲染到 F
我是一名优秀的程序员,十分优秀!