小编Lum*_*ire的帖子

OpenGL Scale单像素线

我想制作一个内部为320x240的游戏,但以整数倍(640x480,960,720等)渲染到屏幕.我打算复古的2D像素图形.

我通过glOrtho()设置内部分辨率来实现这一点:

glOrtho(0, 320, 240, 0, 0, 1);
Run Code Online (Sandbox Code Playgroud)

然后我将输出分辨率放大3倍,如下所示:

glViewport(0,0,960,720);
window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 720, SDL_WINDOW_OPENGL);
Run Code Online (Sandbox Code Playgroud)

我画这样的矩形:

glBegin(GL_LINE_LOOP);
glVertex2f(rect_x, rect_y);
glVertex2f(rect_x + rect_w, rect_y);
glVertex2f(rect_x + dst_w, dst_y + dst_h);
glVertex2f(rect_x, rect_y + rect_h);
glEnd();
Run Code Online (Sandbox Code Playgroud)

它完美地工作在320x240(未缩放):

在此输入图像描述

当我扩展到960x720时,像素渲染一切正常!然而,似乎GL_Line_Loop不是在320x240画布上绘制并按比例放大,而是在最终的960x720画布上绘制.结果是3px世界中的1px行:(

在此输入图像描述

如何在320x240 glOrtho画布上绘制线条,而不是960x720输出画布?

c++ opengl sdl pixel line

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

用于片段着色器的OpenGL GLSL绑定采样器

我希望在2D OpenGL应用程序上实现着色器.我的计划是将场景渲染到帧缓冲对象,然后使用着色器将该帧缓冲对象渲染到屏幕.

这是场景,我已经绘制到帧缓冲对象,然后从那里到屏幕.使用箭头键使月亮移动(我为此感到自豪!)

屏幕1

但是,当我尝试使用着色器程序将framebuffer对象渲染到屏幕时,我得到了这个:

屏幕2

这是非常可悲的.这个片段着色器是我从教程中得到的,我确定问题必须是统一变量.

这是片段着色器:

#version 330

in vec2 texCoord;
out vec4 outputColor;

uniform sampler2D gSampler;

void main()
{
   outputColor = texture2D(gSampler, texCoord);
}
Run Code Online (Sandbox Code Playgroud)

以下是我设置统一变量的方法:

gSampler = glGetUniformLocation(mProgramID, "gSampler");
glUniform1i(gSampler, GL_TEXTURE0);
Run Code Online (Sandbox Code Playgroud)

以下是使用我的着色器程序(mProgramID)将Framebuffer(fbo_texture)渲染到屏幕的方法

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,    0 ); 

glUseProgram(mProgramID);
glColor3f(1.0, 1.0, 1.0);
glEnable(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, fbo_texture);

glBegin(GL_QUADS);x1= 0.0;x2= 400.0;y1= 0.0;y2 = 400.0;
    glTexCoord2f(0.0f, 1.0f); glVertex2f(x1, y1);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(x1, y2);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(x2, y2);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(x2, y1);

glEnd();glDisable(GL_TEXTURE_2D);

SDL_GL_SwapBuffers();
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 - 纹理和采样器之间的联系是什么?如果着色器已经对纹理进行采样,是否需要渲染纹理四边形?如果着色器正在纹理化,为什么不渲染空白四边形呢?

编辑:这是顶点着色器:

void main()
{

    gl_TexCoord[0] …
Run Code Online (Sandbox Code Playgroud)

c++ opengl 2d glsl fragment-shader

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

标签 统计

c++ ×2

opengl ×2

2d ×1

fragment-shader ×1

glsl ×1

line ×1

pixel ×1

sdl ×1