Ios 从着色器渲染没有效果

Ios 从着色器渲染没有效果,ios,opengl-es,Ios,Opengl Es,这不会渲染除清除颜色之外的任何内容: glUseProgram(_rectificationShader.program); // do other things like assigning attributes glGenFramebuffers(1, &_internalFramebuffer); glBindFramebuffer(GL_FRAMEBUFFER, _internalFramebuffer); glActiveTexture(GL_TEXT

这不会渲染除清除颜色之外的任何内容:

  glUseProgram(_rectificationShader.program);

  // do other things like assigning attributes

  glGenFramebuffers(1, &_internalFramebuffer);
  glBindFramebuffer(GL_FRAMEBUFFER, _internalFramebuffer);

  glActiveTexture(GL_TEXTURE0);
  glGenTextures(1, &_referenceTexture);
  glBindTexture(GL_TEXTURE_2D, _referenceTexture);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  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_RED_EXT, referenceImage.cols, referenceImage.rows, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, referenceImageData);
  GLKMatrix3 homography1 = [Utility cvHomographyToOpenGL:H1];
  glUniformMatrix4fv(_rectificationShader.rectificationMatrix, 1, 0, homography1.m);
  glUniform1i(_rectificationShader.tex, GL_TEXTURE0);

  glActiveTexture(GL_TEXTURE1);
  glGenTextures(1, &_referenceRectifiedTexture);
  glBindTexture(GL_TEXTURE_2D, _referenceRectifiedTexture);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  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_RED_EXT, width, height, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, NULL);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _referenceRectifiedTexture, 0);
  GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

  if (status != GL_FRAMEBUFFER_COMPLETE) {
    NSLog(@"failed to make complete framebuffer object %x", status);
    return NO;
  }

  glClearColor(0.5,0.5,0.5,1);
  glClear(GL_COLOR_BUFFER_BIT);
  glDrawArrays(GL_POINTS, 0, imageArea);
简化着色器以进行调试:

// Vertex Shader

static const char* rectificationVS = STRINGIFY
(
 attribute highp vec2 position;
 varying highp vec2 texCoords;

 void main(void)
 {
   gl_Position = vec4(position, 0, 1);
   texCoords = position.xy * vec2(0.5) + vec2(0.5);
 }

 );

// Fragment Shader

static const char* rectificationFS = STRINGIFY
(
 varying highp vec2 texCoords;
 uniform lowp sampler2D tex;

 void main(void)
 {
   gl_FragColor = vec4(1);
 }

 );

位置被输入顶点着色器,并从-1,-1变为1,1。我有什么遗漏吗?如果更改透明颜色,我可以看到导出图像代码中的更改被忽略。

是否缺少视口?是否确定在设置纹理均匀性时不应设置0而不是GL_TEXTURE0?纹理坐标从0变为1,其中左上部分为0,0,右下部分为1,1。插值是通过在着色器中使用variable关键字自动完成的,因此应该是全部。要在您的情况下测试纹理坐标,最好修改片段着色器以直接从纹理坐标输出颜色,例如,使用X坐标表示红色,使用Y坐标表示蓝色。结果必须是一个很好的二维梯度之间的黑色,红色,蓝色和红蓝色。是的,这是一个问题,因为宽度和高度必须在缓冲区相同。在缓冲区中放入referenceImage.cols…现在应用程序中有两大部分可能会产生问题。要排除关于如何创建图像的问题,可以尝试将此纹理绘制到一些可呈现的缓冲区:绘制此图像后,获取屏幕缓冲区并将其绑定,绑定_referenceTexture,设置视口并绘制相同的矩形。。看看你能不能用这种方法得到一个正确的结果,因为我看不出有什么方法能得到你仅仅用图纸得到的结果。