当我渲染到纹理,然后绘制相同的图像时,它似乎使一切变得更暗.要获得此图像:
http://img24.imageshack.us/img24/8061/87993367.png
我将左上角的正方形(1, 1, 1, .8)渲染为纹理,然后渲染该纹理,再将中间正方形(相同的颜色)渲染到另一个纹理,最后将该纹理加上右下方(相同的颜色)到屏幕.
正如你所看到的,每次渲染到纹理时,一切都会变得更暗.
我的渲染到纹理代码看起来像:(我在iPhone上使用OpenGL ES)
// gen framebuffer
GLuint framebuffer;
glGenFramebuffersOES(1, &framebuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
// gen texture
GLuint texture;
glGenTextures(1, &texture);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
// hook it up
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);
if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES))
return false;
// set up drawing
glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);
glViewport(0, 0, Screen::Width, Screen::Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Screen::Width, 0, Screen::Height, -1, 1); …Run Code Online (Sandbox Code Playgroud) 我有一个小程序,呈现黄色三角形两次,一次在帧缓冲的左半部分,一次在右侧.
转储纹理

现在,之后我在屏幕上渲染此帧缓冲区的内容.
如果我在framebuffer构造函数中使用GL_TEXTURE_RECTANGLE,它可以工作:
https://github.com/elect86/Joglus/blob/master/Joglolus/src/joglus/example1/FrameBuffer.java
在绑定纹理时,函数renderFullScreenQuad,第372行:
https://github.com/elect86/Joglus/blob/master/Joglolus/src/joglus/example1/GlViewer.java
并在片段着色器中使用sampler2DRect:
#version 330
out vec4 outputColor;
uniform sampler2DRect texture0;
void main() {
outputColor = texture(texture0, gl_FragCoord.xy);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将所有RECTANGLE更改为2D并且我在fs中使用sample2D,我会在显示结束时获得一个完整的黑色图像(),尽管纹理的转储始终显示正确的图像......我想知道为什么.
我知道XNA中的渲染目标是不稳定的,但它们有多么不稳定?我找不到任何文件来告诉他们的内容何时被丢弃.是在你开始吸引他们的时候,还是在任何时候?
我想简单地绘制一个渲染目标,然后无限期地将其用作Texture2D.这可能吗?我需要启用RenderTargetUsage.PreserveContents它才能正常工作吗?我已经读过PreserveContents在Xbox和手机硬件上非常慢.
我正在尝试将具有内部格式的纹理附加GL_R32UI到帧缓冲区,以用作ID缓冲区。但是,即使它是唯一的附件,也要glCheckFramebufferStatus不断提出GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT。
这对我来说很奇怪,因为OpenGL 4.2规范似乎GL_R32UI表明OpenGL实现是附加到帧缓冲区时OpenGL实现必须支持的格式之一。我怀疑这是驱动程序错误。我是对的,还是有人可以告诉我我所忽略的东西?
我希望在 Three.js 中使用视频纹理作为脸部。我知道如果您有视频数据,这很容易做到。但是,如果我只有正在播放的元素,我该怎么办?
例如:我如何播放 YouTube 视频并将视频或播放器复制到 Three.js 中的脸上?
我有几个纹理将在我的屏幕上保持静止.我不是在渲染时单独渲染每个渲染,而是将它们全部渲染为一个纹理.到目前为止我的代码看起来像:
SDL_Texture* target_texture = NULL;
SDL_SetRenderTarget(renderer, target_texture);
SDL_RenderCopy(renderer, texture1, NULL, &dst1);
SDL_RenderCopy(renderer, texture2, NULL, &dst2);
SDL_RenderCopy(renderer, texture3, NULL, &dst3);
.
.
.
SDL_SetRenderTarget(renderer, NULL);
SDL_RendererPresent(renderer);
// Here the screen displays as I want
SDL_Delay(2000);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, target_texture, NULL, NULL);
SDL_RendererPresent(renderer);
// Here the screen is black as though target_texture is still NULL
Run Code Online (Sandbox Code Playgroud) 当渲染到具有无符号整数格式的FBO时,我可能不能:
gl_FragColour = uvec4(100,100,100,100);
Run Code Online (Sandbox Code Playgroud)
因为gl_FragColour是一个vec4.所以我想我必须定义自己的?
out uvec4 colour
Run Code Online (Sandbox Code Playgroud)
但是如果没有任何其他变化,这将被正确解释吗?
此外,我想对无符号整数格式和普通浮点纹理使用相同的着色器,并在统一(静态分支)上使用if.我猜这是不可能的(除非我可以有2个出局而且只设置一个?)我可能需要探索一个函数指针方法?
因此,我将场景渲染为纹理,然后我需要在 js 中处理纹理,然后修改内容或从一组值创建新纹理。
似乎我需要获取 WebGL 上下文并直接与 WebGL 接口来完成此操作。有人知道这样做的最佳方法吗?
如何通过动态纹理C有效地插入每像素两个纹理A和B并在简单的四边形上绘制它们?接受多遍算法.
我已经成功地计算了CPU上每帧的C纹理并将其上传glTexImage2D到仅alpha纹理中.
虽然这很有效,但性能却很差,我不得不将C的尺寸减小到全尺寸的一半,以克服复制带宽瓶颈.
因此,出于性能原因,我正在尝试使用渲染到纹理来完成所有C纹理更新.
我能够为渲染设置必要的缓冲区,但从根本上说,我得到RGB或RGBA格式的纹理,掩模用亮度/RGB信息编码,而不是alpha.
如何有效地将其转换为我需要插入纹理管道的alpha纹理?请记住,iPhone上没有可编程管道(着色器)和只有两个纹理单元.
更新: A和B是仅RGB的纹理,即没有alpha.
我在使用FBO时遇到了问题.
我的窗口大小是1200x300.
当我创建一个1200x300的FBO时,一切都很好.
但是,当我创建尺寸为2400x600的FBO(实际上,两个轴上的两倍大)并尝试渲染完全相同的基元时,我只使用了FBO实际区域的四分之一.
FBO与窗口大小相同:

FBO两倍大(可以注意到三角形剪裁):

我将这两个三角形渲染成FBO,然后渲染一个全屏四边形,其上有一个FBO纹理.我用这种松绿色清除FBO,所以我确定第二张照片上的所有空白空间实际上来自FBO.
// init() of the program
albedo = new RenderTarget(2400, 600, 24 /*depth*/); // in first case, params are 1200, 300, 24
// draw()
RenderTarget::set(albedo); // render to fbo
RenderTarget::clearColor(0.0f, 0.3f, 0.3f, 1.0f);
RenderTarget::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// render triangles ...
glDrawArrays(GL_TRIANGLES, 0, 6);
// now it's time to render a fullscreen quad
RenderTarget::set(); // render to back-buffer
RenderTarget::clearColor(0.3f, 0.0f, 0.0f, 1.0f);
RenderTarget::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, albedo->texture());
glUniform1i(albedoUnifLoc, 0);
RenderTarget::drawFSQ(); // draw fullscreen quad …Run Code Online (Sandbox Code Playgroud)