Ejemplo n.º 1
0
void CaptureWinGLEngine::shader_YUV()
{
	m_screenTextureCount = 3;
	glGenTextures(m_screenTextureCount, m_screenTexture);

	glActiveTexture(GL_TEXTURE0);
	configureTexture(0);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_frameWidth, m_frameHeight, 0,
		     GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
	checkError("YUV shader texture 0");

	glActiveTexture(GL_TEXTURE1);
	configureTexture(1);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_frameWidth / 2, m_frameHeight / 2, 0,
		     GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
	checkError("YUV shader texture 1");

	glActiveTexture(GL_TEXTURE2);
	configureTexture(2);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_frameWidth / 2, m_frameHeight / 2, 0,
		     GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
	checkError("YUV shader texture 2");

	bool src_c = m_shaderProgram.addShaderFromSourceCode(
				QGLShader::Fragment,
				"uniform sampler2D ytex;"
				"uniform sampler2D utex;"
				"uniform sampler2D vtex;"
				"void main()"
				"{"
				"   vec2 xy = vec2(gl_TexCoord[0].xy);"
				"   float y = 1.1640625 * (texture2D(ytex, xy).r - 0.0625);"
				"   float u = texture2D(utex, xy).r - 0.5;"
				"   float v = texture2D(vtex, xy).r - 0.5;"
				"   float r = y + 1.59765625 * v;"
				"   float g = y - 0.390625 * u - 0.8125 *v;"
				"   float b = y + 2.015625 * u;"
				"   gl_FragColor = vec4(r, g, b, 1.0);"
				"}"
				);

	if (!src_c)
		fprintf(stderr, "OpenGL Error: YUV shader compilation failed.\n");

	m_shaderProgram.bind();
}
Ejemplo n.º 2
0
void SmokeShader::setup()
{
  createProgramWithShaders();
  configureProgramWithShaders();
  createTexture();
  configureTexture();
  MatrixTransform::setup();
}
Ejemplo n.º 3
0
void SmokeShader::render(const glm::mat4& matrix)
{
  configureProgramWithShaders();
  configureTexture();

  MatrixTransform::render(matrix);

  glUseProgram(0);
}
Ejemplo n.º 4
0
void CaptureWinGLEngine::shader_YUY2(__u32 format)
{
	m_screenTextureCount = 1;
	glGenTextures(m_screenTextureCount, m_screenTexture);
	configureTexture(0);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_frameWidth / 2, m_frameHeight, 0,
		     GL_RGBA, GL_UNSIGNED_BYTE, NULL);
	checkError("YUY2 shader");

	QString codeHead = QString("uniform sampler2D tex;"
				   "uniform float texl_w;"
				   "uniform float tex_w;"
				   "void main()"
				   "{"
				   "   float y, u, v;"
				   "   vec4 luma_chroma;"
				   "   float pixelx = gl_TexCoord[0].x;"
				   "   float pixely = gl_TexCoord[0].y;"
				   "   float xcoord = floor(pixelx * tex_w);"
				   );

	QString codeBody = shader_YUY2_invariant(format);

	QString codeTail = QString("   float r = y + 1.5958 * v;"
				   "   float g = y - 0.39173 * u - 0.81290 * v;"
				   "   float b = y + 2.017 * u;"
				   "   gl_FragColor = vec4(r, g, b, 1.0);"
				   "}"
				   );

	bool src_ok = m_shaderProgram.addShaderFromSourceCode(
				QGLShader::Fragment, QString("%1%2%3").arg(codeHead, codeBody, codeTail)
				);

	if (!src_ok)
		fprintf(stderr, "OpenGL Error: YUY2 shader compilation failed.\n");

	m_shaderProgram.bind();
}
Ejemplo n.º 5
0
void CaptureWinGLEngine::shader_BGR()
{
	m_screenTextureCount = 1;
	glGenTextures(m_screenTextureCount, m_screenTexture);
	configureTexture(0);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_frameWidth, m_frameHeight, 0,
		     GL_RGB, GL_UNSIGNED_BYTE, NULL);
	checkError("BGR shader");

	bool src_c = m_shaderProgram.addShaderFromSourceCode(
				QGLShader::Fragment,
				"uniform sampler2D tex;"
				"void main()"
				"{"
				"   vec4 color = texture2D(tex, gl_TexCoord[0].xy);"
				"   gl_FragColor = vec4(color.b, color.g, color.r, 1.0);"
				"}"
				);
	if (!src_c)
		fprintf(stderr, "OpenGL Error: BGR shader compilation failed.\n");

	m_shaderProgram.bind();
}
Ejemplo n.º 6
0
void CaptureWinGLEngine::changeShader()
{
	m_formatChange = false;
	clearShader();

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0, m_frameWidth, m_frameHeight, 0, 0, 1);
	resizeGL(QGLWidget::width(), QGLWidget::height());
	checkError("Render settings.\n");

	switch (m_frameFormat) {
	case V4L2_PIX_FMT_YUYV:
	case V4L2_PIX_FMT_YVYU:
	case V4L2_PIX_FMT_UYVY:
	case V4L2_PIX_FMT_VYUY:
		shader_YUY2(m_frameFormat);
		break;

	case V4L2_PIX_FMT_YUV420:
	case V4L2_PIX_FMT_YVU420:
		shader_YUV();
		break;

	case V4L2_PIX_FMT_RGB32:
		m_screenTextureCount = 1;
		glActiveTexture(GL_TEXTURE0);
		glGenTextures(m_screenTextureCount, m_screenTexture);
		configureTexture(0);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, m_frameWidth, m_frameHeight, 0,
			     GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, NULL);
		checkError("RGB32 shader");
		break;

	case V4L2_PIX_FMT_BGR32:
		m_screenTextureCount = 1;
		glActiveTexture(GL_TEXTURE0);
		glGenTextures(m_screenTextureCount, m_screenTexture);
		configureTexture(0);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, m_frameWidth, m_frameHeight, 0,
			     GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
		checkError("BGR32 shader");
		break;

	case V4L2_PIX_FMT_RGB555:
		m_screenTextureCount = 1;
		glActiveTexture(GL_TEXTURE0);
		glGenTextures(m_screenTextureCount, m_screenTexture);
		configureTexture(0);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, m_frameWidth, m_frameHeight, 0,
			     GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL);
		checkError("RGB555 shader");
		break;

	case V4L2_PIX_FMT_RGB565:
		m_screenTextureCount = 1;
		glActiveTexture(GL_TEXTURE0);
		glGenTextures(m_screenTextureCount, m_screenTexture);
		configureTexture(0);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_frameWidth, m_frameHeight, 0,
			     GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL);
		checkError("RGB565 shader");
		break;
	case V4L2_PIX_FMT_BGR24:
		shader_BGR();
		break;
	case V4L2_PIX_FMT_RGB24:
	default:
		m_screenTextureCount = 1;
		glActiveTexture(GL_TEXTURE0);
		glGenTextures(m_screenTextureCount, m_screenTexture);
		configureTexture(0);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_frameWidth, m_frameHeight, 0,
			     GL_RGB, GL_UNSIGNED_BYTE, NULL);
		checkError("Default shader");
		break;
	}

	glClear(GL_COLOR_BUFFER_BIT);
}
Ejemplo n.º 7
0
void GLTexture::init() {
	if (m_fbType == ENone)
		Log(ETrace, "Uploading a texture : %s", toString().c_str());
	else
		Log(ETrace, "Creating a framebuffer : %s", toString().c_str());

	if (m_samples > 1) {
		int maxSamples = 1;
		if (GLEW_ARB_texture_multisample)
			glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples);
		if (m_samples > maxSamples) {
			Log(EWarn, "Attempted to create a multisample framebuffer "
				"with an unsupported number of samples (requested=%i, supported=%i)",
				m_samples, maxSamples);
			m_samples = maxSamples;
		}
	}

	lookupGLConstants();

	/* Generate an identifier */
	glGenTextures(1, &m_id);

	/* Bind to the texture */
	glBindTexture(m_glType, m_id);

	/* Set the texture filtering / wrapping modes
	   (don't do this for multisample textures)*/
	if (!((m_fbType & EColorBuffer) && m_samples > 1))
		configureTexture(); /* Multisample textures don't have these parameters */

	if (m_fbType == ENone) {
		Assert(m_samples == 1);
		refresh();
	} else {
		/* Create the FBO and bind it */
		glGenFramebuffersEXT(1, &m_fboId);
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fboId);

		AssertEx(glIsFramebufferEXT(m_fboId), "Creating an FBO failed");
		bool depthAsTexture = m_fbType & EDepthBuffer;

		switch (m_fbType) {
			case EColorAndDepthBuffer:
			case EColorBuffer: {
					if (m_type == ETexture2D) {
						if (!depthAsTexture) {
							glGenRenderbuffersEXT(1, &m_depthId);
							glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthId);
							if (m_samples == 1)
								glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,
									GL_DEPTH_COMPONENT32, m_size.x, m_size.y);
							else
								glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT,
									m_samples, GL_DEPTH_COMPONENT32, m_size.x, m_size.y);
							glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
								GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthId);
						} else {
							glGenTextures(1, &m_depthId);
							glBindTexture(m_glType, m_depthId);
							configureTexture();
							glTexParameteri(m_glType, GL_TEXTURE_COMPARE_MODE, GL_NONE);
							glTexParameteri(m_glType, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
							if (m_samples == 1)
								glTexImage2D(m_glType, 0, GL_DEPTH_COMPONENT32, m_size.x, m_size.y,
									0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
							else
								glTexImage2DMultisample(m_glType,
									m_samples, GL_DEPTH_COMPONENT32, m_size.x, m_size.y, GL_FALSE);
							glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
								GL_DEPTH_ATTACHMENT, m_glType, m_depthId, 0);
							glBindTexture(m_glType, m_id);
						}

						if (m_samples == 1)
							glTexImage2D(m_glType, 0, m_internalFormat, m_size.x, m_size.y,
								0, m_format, m_dataFormat, NULL);
						else
							glTexImage2DMultisample(m_glType,
								m_samples, m_internalFormat, m_size.x, m_size.y, GL_FALSE);

						if (isMipMapped())
							glGenerateMipmapEXT(m_glType);

						glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
							GL_COLOR_ATTACHMENT0_EXT, m_glType, m_id, 0);
					} else if (m_type == ETextureCubeMap) {
						Assert(m_size.x == m_size.y && math::isPowerOfTwo(m_size.x));
						Assert(m_fbType == EColorBuffer);
						Assert(m_samples == 1);

						for (int i=0; i<6; i++)
							glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_internalFormat,
								m_size.x, m_size.y, 0, m_format, m_dataFormat, NULL);

						if (isMipMapped())
							glGenerateMipmapEXT(m_glType);

						if (depthAsTexture) {
							/* Generate an identifier */
							glGenTextures(1, &m_depthId);
							glBindTexture(m_glType, m_depthId);
							glTexParameteri(m_glType, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
							glTexParameteri(m_glType, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

							for (int i=0; i<6; i++)
								glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT32,
									m_size.x, m_size.y, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);

							if (GLEW_EXT_geometry_shader4)
								activateSide(-1);
							else
								activateSide(0);
						} else {
							glGenRenderbuffersEXT(1, &m_depthId);
							glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthId);
							glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT,
								GL_DEPTH_COMPONENT32, m_size.x, m_size.y);
							glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
								GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthId);
							activateSide(0);
						}
					} else {
						Log(EError, "Unsupported texture type!");
					}
				}
				break;
			case EDepthBuffer:
				Assert(m_samples == 1);
				if (m_depthMode == ECompare) {
					glTexParameteri(m_glType, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
					glTexParameteri(m_glType, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
				}

				if (m_type == ETexture2D) {
					/* Allocate the texture memory */
					glTexImage2D(m_glType, 0, m_internalFormat,
						m_size.x, m_size.y, 0, GL_DEPTH_COMPONENT,
						m_dataFormat, NULL);

					/* Attach the texture as a depth target */
					glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
						GL_DEPTH_ATTACHMENT_EXT, m_glType, m_id, 0);
				} else if (m_type == ETextureCubeMap) {
					Assert(m_size.x == m_size.y && math::isPowerOfTwo(m_size.x));
					for (int i=0; i<6; i++)
						glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, m_internalFormat,
							m_size.x, m_size.y, 0, m_format, m_dataFormat, NULL);

					if (GLEW_EXT_geometry_shader4)
						activateSide(-1);
					else
						activateSide(0);
				} else {
					Log(EError, "Unsupported texture type!");
				}

				glDrawBuffer(GL_NONE);
				glReadBuffer(GL_NONE);
				break;
			default:
				Log(EError, "Invalid render buffer type!");
		}

		GLenum errorStatusID = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
		std::string errorStatus;
		switch (errorStatusID) {
			case GL_FRAMEBUFFER_COMPLETE_EXT: break;
			case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
				errorStatus = "Incomplete attachment"; break;
			case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
				errorStatus = "Unsupported framebuffer format"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT:
				errorStatus = "Incomplete framebuffer - duplicate attachment"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
				errorStatus = "Incomplete framebuffer - missing attachment"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
				errorStatus = "Incomplete framebuffer - invalid dimensions"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
				errorStatus = "Incomplete framebuffer - no draw buffer"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
				errorStatus = "Incomplete framebuffer - invalid formats"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
				errorStatus = "Incomplete framebuffer - no readbuffer"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT:
				errorStatus = "Incomplete multisample framebuffer"; break;
			case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
				errorStatus = "Incomplete layer targets"; break;
			default:
				errorStatus = "Unknown error status"; break;
		}
		if (!errorStatus.empty())
			Log(EError, "FBO Error 0x%x: %s!\nFramebuffer configuration: %s",
				errorStatusID, errorStatus.c_str(), toString().c_str());

		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, GL_NONE);
	}

	glBindTexture(m_glType, GL_NONE);
}