コード例 #1
0
void RenderContext::create() {
  if(s_primedContext || s_creationLock) {
    logThrowGL("[RenderContext] You cannot create a RenderContext while "
               "another is primed or being created!");
  }
  s_creationLock = true;

  // context needs to be current to call glewInit
  makeCurrent();

  // glewExperimental to use context versions above 3.2
  // TODO: call glewInit just once (???)
  glewExperimental = GL_TRUE;
  GLenum status = glewInit();

  // check for errors
  if(status != GLEW_OK) {
    logThrowGL("[RenderContext] glewInit() failed with status <", status, ">!");
  }

  // check for GL error (glew often causes one when using new context versions)
  auto err = glGetError();
  if(err != GL_NO_ERROR) {
    logNotice("[RenderContext] glewInit() caused an openGL error <",
              translateGLError(err), ">.");
  }

  // configure context
  configure();

  // reset state
  resetCurrent();
  s_creationLock = false;
  m_wasCreated = true;
}
コード例 #2
0
GLTexture::GLTexture(GLenum target)
	: target(target)
{
	glGenTextures(1, &name);
	if (!name)
		panic("Unable to allocate GL texture: glGenTextures() failed: " + translateGLError(glGetError()));
}
コード例 #3
0
std::shared_ptr<GLTexture> GLTexture::create2d(
	GLenum internalFormat,
	FilterRule filterRule,
	EdgeRule edgeRule,
	PixelImage &image)
{
	auto that = std::shared_ptr<GLTexture>(new GLTexture(GL_TEXTURE_2D));

	that->bind();

	glTexParameteri(that->target, GL_TEXTURE_MIN_FILTER, filterRule.minFilter);
	glTexParameteri(that->target, GL_TEXTURE_MAG_FILTER, filterRule.magFilter);
	glTexParameteri(that->target, GL_TEXTURE_WRAP_S, edgeRule.edgeX);
	glTexParameteri(that->target, GL_TEXTURE_WRAP_T, edgeRule.edgeY);
	glTexParameteri(that->target, GL_TEXTURE_WRAP_R, edgeRule.edgeZ);

	GLenum imageFormat;
	GLenum imageUnitType;

	switch (image.getFormat()) {
	case PixelImage::Format::RGB:
		imageFormat = GL_RGB;
		imageUnitType = GL_UNSIGNED_BYTE;
		break;

	case PixelImage::Format::RGBA:
		imageFormat = GL_RGBA;
		imageUnitType = GL_UNSIGNED_BYTE;
		break;

	default:
		complain("Unrecognized/unsupported pixel image format");
		return nullptr;
	}

	glTexImage2D(GL_TEXTURE_2D,
		0, internalFormat,
		image.getWidth(), image.getHeight(), 0,
		imageFormat, imageUnitType, image.getData());

	GLenum err = glGetError();
	if (err) {
		complain("Error creating texture from pixel image: glTexImage2D() failed: " + translateGLError(err));
		return nullptr;
	}

	return that;
}
コード例 #4
0
GLRenderBuffer::GLRenderBuffer()
{
	glGenRenderbuffers(1, &name);
	if (!name)
		panic("Unable to create a GL renderbuffer: glGenRenderbuffers() failed: " + translateGLError(glGetError()));
}