OpenGL ES 3.0-Transform Feedback Object

TFO 可以用来获取顶点着色器的输出属性组的缓冲,基本步骤如下。
1.设置需要输出的属性组

GLchar const * Strings[] = {"gl_Position", "vColor"}; 
glTransformFeedbackVaryings(Program, 2, Strings, GL_INTERLEAVED_ATTRIBS);


2. 创建TFO,设置输出缓冲。

void InitTransformFeedback()
{
glGenTransformFeedbacks(1, &g_FeedbackObj);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, g_FeedbackObj);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, g_FeedbackBuffer);  
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
}
void InitVBO()
{
// Generate a buffer object
glGenBuffers(1, &g_TransformBuffer);
glBindBuffer(GL_ARRAY_BUFFER, g_TransformBuffer);
glBufferData(GL_ARRAY_BUFFER, g_PositionSize, g_Triangle, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);


glGenBuffers(1, &g_FeedbackBuffer);
glBindBuffer(GL_ARRAY_BUFFER, g_FeedbackBuffer);
glBufferData(GL_ARRAY_BUFFER, g_PositionSize, NULL, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

3.  绘制源图象,求反馈数据

        glUseProgram(g_TransformProgram);
	glEnable(GL_RASTERIZER_DISCARD);
	CHECK_GL_ERROR


	glUniformMatrix4fv(g_TransformUniformMVP, 1, GL_FALSE, matModelView);
	CHECK_GL_ERROR
	
	glEnableVertexAttribArray(g_TransformPositionLoc);
	CHECK_GL_ERROR
	glEnableVertexAttribArray(g_TransformColorLoc);
	CHECK_GL_ERROR


	glBindBuffer(GL_ARRAY_BUFFER, g_TransformBuffer);
	glVertexAttribPointer(g_TransformPositionLoc, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 8, 0);
	CHECK_GL_ERROR
	glVertexAttribPointer(g_TransformColorLoc, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 8, BUFFER_OFFSET(sizeof(float)*4));
	CHECK_GL_ERROR


	glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, g_FeedbackObj);
	glBeginTransformFeedback(GL_TRIANGLES);
	
	glDrawArrays(GL_TRIANGLES, 0, 3);
	CHECK_GL_ERROR


	glEndTransformFeedback();
	CHECK_GL_ERROR
	glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
	CHECK_GL_ERROR


	glDisable(GL_RASTERIZER_DISCARD);



4. 影射到内存空间
                
                 glBindBuffer(GL_ARRAY_BUFFER, g_FeedbackBuffer);
		void* rawdata = glMapBufferRange( GL_ARRAY_BUFFER, 0,  g_PositionSize, GL_MAP_READ_BIT);
		
		float *p = (float*)rawdata;
		for(int i=0; i<6; i++)
		{
			float a = p[i*3+0];
			float b = p[i*3+1];
			float c = p[i*3+2];
		}


		glUnmapBuffer(GL_ARRAY_BUFFER);
		glBindBuffer(GL_ARRAY_BUFFER, 0);





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值