Can';在OpenGL中以像素精度绘制(不使用固定函数管道)

Can';在OpenGL中以像素精度绘制(不使用固定函数管道),opengl,Opengl,我试图在OpenGL中渲染棋盘,但我得到了错误的输出。[棋盘]“大棋盘” 我试图缩小问题的范围,我注意到当我尝试绘制一个11乘11的网格时,我在垂直方向上只得到10个像素[小棋盘]“小棋盘” 纹理本身是好的。我怀疑问题出在顶点坐标上。代码如下: 纹理创建: const int size = 11; unsigned char buffer[size * size * 4]; for (size_t i = 0; i < size; i++) { for (size_t j =

我试图在OpenGL中渲染棋盘,但我得到了错误的输出。[棋盘]“大棋盘”

我试图缩小问题的范围,我注意到当我尝试绘制一个11乘11的网格时,我在垂直方向上只得到10个像素[小棋盘]“小棋盘”

纹理本身是好的。我怀疑问题出在顶点坐标上。代码如下:

纹理创建:

const int size = 11;

unsigned char buffer[size * size * 4];

for (size_t i = 0; i < size; i++)
{
    for (size_t j = 0; j < size; j++)
    {
        unsigned char rgb = i % 2 == 1 || j % 2 == 1 ? 255 : 0;
        int index = (i * size + j) * 4;
        buffer[index] = rgb;
        buffer[index + 1] = rgb;
        buffer[index + 2] = rgb;
        buffer[index + 3] = 255;
    }
}
顶点:(屏幕大小为1024*768,我正在绘制,右上角没有任何变换)

图纸:

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
和着色器:

const char* VertexShaderCode =
    "attribute vec4 a_position; \n"
    "attribute vec2 a_texCoord; \n"
    "varying vec2 v_texCoord; \n"
    "void main() \n"
    "{ \n"
    " gl_Position = a_position; \n"
    " v_texCoord = a_texCoord; \n"
    "}";

const char* FragmentShaderCode =
    "uniform sampler2D s_texture; \n"
    "varying vec2 v_texCoord; \n"
    "void main() \n"
    "{ \n"
    " gl_FragColor = texture2D(s_texture, v_texCoord); \n"
    "}";

这是一个常见问题。在StackOverflow上已经回答了无数次(我也是)。这里有一个答案


基本上你遇到了一个围栏张贴问题。

这是一个常见问题。在StackOverflow上已经回答了无数次(我也是)。这里有一个答案


实际上,您遇到了围栏张贴问题。

这是我代码中的一个错误。与OpenGL无关。我将宽度和高度传递到CreateWindow,而不是adjustedWidth和adjustedHeight。(我计算时考虑了边框和菜单栏)

这是我代码中的一个bug。与OpenGL无关。我将宽度和高度传递到CreateWindow,而不是adjustedWidth和adjustedHeight。(我计算时考虑了边框和菜单栏)

此外,您将
vec2
传递到
a_位置
,但它在着色器中声明为
vec4
。另外,棋盘格模式不应该是
(i%2!=j%2)吗?255 : 0;?它可能不应该被称为棋盘。我只是用这个图案来验证纹理贴图。可能是@Nicolabolas的重复不是,他的问题不是瓷砖,它看起来是错误的,但他试图解决的问题是,他正在映射一个11x11纹理,并且只得到一个在整个UV范围内显示的11x10纹理,将
vec2
传递到
a_位置
,但它在着色器中声明为
vec4
。另外,棋盘格模式不应该是
(i%2!=j%2)吗?255 : 0;?它可能不应该被称为棋盘。我只是用这个图案来验证纹理映射。可能是@Nicolabolas的重复不是,他的问题不是瓷砖,看起来是错误的,但他试图解决的问题是,他映射的是一个11x11纹理,只有一个11x10纹理显示在完整的UV范围内。你能详细说明一下吗?我看过类似的文章,但不太清楚如何将纹理贴图和顶点坐标计算联系起来。我不知道该在哪里解决这个问题。@JamesRollinson如果错误不在您发布的代码中,我复制了您的代码并添加了常用的样板代码。它看起来很好:事实上,问题是11*10的尺寸-请看评论@NicolBolas@JamesRollinson是你的代码与一些样板SFML,但我相信你可以很容易地取代它与任何你使用。我能够缩小问题。您的代码创建了一个600*600的窗口,并绘制了一个大矩形。这就是为什么你可能看不到这个问题。我想要一个屏幕上11*11像素的矩形。这就是为什么我尝试设置float w=size/512.0f;这样地。但除此之外,我运行我的代码没有纹理,它也有同样的问题-我只得到11*10的矩形!所以我想问题是因为分辨率是1024*768,顶点坐标由于某种原因不正确,你能解释一下吗?我看过类似的文章,但不太清楚如何将纹理贴图和顶点坐标计算联系起来。我不知道该在哪里解决这个问题。@JamesRollinson如果错误不在您发布的代码中,我复制了您的代码并添加了常用的样板代码。它看起来很好:事实上,问题是11*10的尺寸-请看评论@NicolBolas@JamesRollinson是你的代码与一些样板SFML,但我相信你可以很容易地取代它与任何你使用。我能够缩小问题。您的代码创建了一个600*600的窗口,并绘制了一个大矩形。这就是为什么你可能看不到这个问题。我想要一个屏幕上11*11像素的矩形。这就是为什么我尝试设置float w=size/512.0f;这样地。但除此之外,我运行我的代码没有纹理,它也有同样的问题-我只得到11*10的矩形!所以我想问题是因为分辨率是1024*768,而顶点坐标由于某种原因是不正确的
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
const char* VertexShaderCode =
    "attribute vec4 a_position; \n"
    "attribute vec2 a_texCoord; \n"
    "varying vec2 v_texCoord; \n"
    "void main() \n"
    "{ \n"
    " gl_Position = a_position; \n"
    " v_texCoord = a_texCoord; \n"
    "}";

const char* FragmentShaderCode =
    "uniform sampler2D s_texture; \n"
    "varying vec2 v_texCoord; \n"
    "void main() \n"
    "{ \n"
    " gl_FragColor = texture2D(s_texture, v_texCoord); \n"
    "}";