相关疑难解决方法(0)

GLSL texture2D()总是返回(0,0,0,1)

我对此感到非常困惑.我正在尝试渲染到屏幕外的纹理,以便我可以执行一些后期处理,但甚至无法获得该纹理以不加修改地绘制到屏幕上.我目前正在iPhone模拟器上瞄准OpenGL ES 2.0.

我已经将问题缩小到GLSL的texture2D()函数返回vec4(0,0,0,1),因为如果我用任何常量颜色替换该调用,屏幕将填充指定的颜色.创建纹理,绑定到纹理单元0,分配其存储,将其min和mag滤波器设置为NEAREST,并将sampler2D uniform设置为0.

我已经尝试删除所有渲染到纹理代码并显式初始化它的数据,我得到相同的结果,如果直接定位屏幕帧缓冲区,我得到我期望的图像,所以我相当自信纹理的数据是所有这些都是在我尝试从中抽样的时候定义的.

我已经尝试确保我的纹理在渲染时没有绑定到任何纹理单元,但这并没有什么区别.

我也试过glEnable(GL_TEXTURE_2D),但我的印象是ES 2.0无关紧要.反正它没有帮助.

我实际上是在OpenGL ES 2.0中使用我自己的瘦C++包装器库,但是如果你很了解OpenGL ES 2.0,那么这段代码中发生的事情应该是清楚的.我为代码不是普通的OpenGL道歉; 我的下一个调试步骤是在没有我的包装器库的情况下重新编写代码.我只是想知道我是否犯了任何跳出来的骨头错误.

但是,在最后一次drawArrays调用我设置的所有状态变量之前,我已经添加了普通的OpenGL glGet*()查询,并且所有内容都按预期设置.

代码中唯一不那么显而易见的部分是Smart <>对象.它们只是包装GL对象引用和引用数组,并在它们的析构函数中调用它们相关的glDelete*().

#include <tsvl/vec.hpp>
using namespace tsvl;

#include <tsgl2/Context.hpp>
#include <tsgl2/Smart.hpp>
using namespace tsgl2;

#include <array>
#include <exception>
#include <string>
using namespace std;

#define SHADER_SOURCE(text) "#version 100\n" #text


namespace {

const AttributeLocation vertexPositionAttributeLocation(0);

const string vec2PassthroughVertexShaderSource = SHADER_SOURCE(
  attribute vec2 vertexPosition;
  void main() {
    gl_Position = vec4(vertexPosition, 0, 1);
  }
);

const string greenFragmentShaderSource = SHADER_SOURCE(
  void main() {
    gl_FragColor = vec4(0, 1, …
Run Code Online (Sandbox Code Playgroud)

opengl-es opengl-es-2.0

2
推荐指数
1
解决办法
2572
查看次数

标签 统计

opengl-es ×1

opengl-es-2.0 ×1